malloc函数Debug Assertion Failed!

娥月葬星魂 2019-07-15 11:42:25
初学malloc函数,写了一段代码如下:
#include<stdio.h>
#include<stdlib.h>

int output(char *a)
{
a=(char *)malloc(100);
a="12s";
printf("%s",a);
free(a);
return 0;
}
int main()
{
char *b;
output(b);
return 0;
}
编译时显示Debug Assertion Failed!百度了一下说是这个一般是使用了野指针导致的,比如某个指针指向一个局部变量,而在该变量作用域外使用该指针引用了该对象。但是我这个问题在哪呢?本菜鸟怎么看也没问题啊,求各路大神指导!!
还有一个问题是如果对a赋值的时候用下标的话编译会出现“屯屯屯”,不知道为啥内存溢出了?求讲解~
#include<stdio.h>
#include<stdlib.h>

int output(char *a)
{
a=(char *)malloc(100);
a[0]='1';
a[1]='2';
a[2]='s';
// a="12s";
printf("%s",a);
free(a);
return 0;
}
int main()
{
char *b;
output(b);
return 0;
}
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2019-07-15
  • 打赏
  • 举报
回复
a=(char *)malloc(100);
a="12s";

如上这两句,第二句已经导致内存泄露了。指针a指向了堆上的100个字节大小的内存空间,但是第二句相当于把指向堆上的空间
改成了字符串常量"12s"了,相当于改变了指针变量里的地址值。后面free(a);已经有问题了,因为现在a指向的是"12s",不是堆上
开始申请的空间了,所以会有问题。改为:
a=(char *)malloc(100);
strcpy(a, "12s");

即可。
636f6c696e 2019-07-15
  • 打赏
  • 举报
回复
两个错误,c数组这样声明长度只有1,c数组赋值没有加\0

char c[10]="";
a=(char *)malloc(100);
c[0]='1';
c[1]='2';
c[2]='s';
c[3]='\0';
strcpy(a,c);
引用 3 楼 qq_41207969 的回复:
感谢,那么如果需要对a逐位赋值的话应该怎么办?我想着先对一个数组进行赋值,完了再用strcpy拷贝: char c[]=""; a=(char *)malloc(100); c[0]='1'; c[1]='2'; c[2]='s'; strcpy(a,c); 但运行的时候还是12s后面有个问号有个框。。
娥月葬星魂 2019-07-15
  • 打赏
  • 举报
回复
谢谢两位大佬,问题解决了,笔芯么么哒
自信男孩 2019-07-15
  • 打赏
  • 举报
回复
引用 3 楼 qq_41207969 的回复:
感谢,那么如果需要对a逐位赋值的话应该怎么办?我想着先对一个数组进行赋值,完了再用strcpy拷贝:
char c[]="";
a=(char *)malloc(100);
c[0]='1';
c[1]='2';
c[2]='s';
strcpy(a,c);
但运行的时候还是12s后面有个问号有个框。。

那是因为没有加'\0'
娥月葬星魂 2019-07-15
  • 打赏
  • 举报
回复
感谢,那么如果需要对a逐位赋值的话应该怎么办?我想着先对一个数组进行赋值,完了再用strcpy拷贝: char c[]=""; a=(char *)malloc(100); c[0]='1'; c[1]='2'; c[2]='s'; strcpy(a,c); 但运行的时候还是12s后面有个问号有个框。。
轻箬笠 2019-07-15
  • 打赏
  • 举报
回复
引用 1 楼 自信男孩 的回复:
a=(char *)malloc(100);
a="12s";

如上这两句,第二句已经导致内存泄露了。指针a指向了堆上的100个字节大小的内存空间,但是第二句相当于把指向堆上的空间
改成了字符串常量"12s"了,相当于改变了指针变量里的地址值。后面free(a);已经有问题了,因为现在a指向的是"12s",不是堆上
开始申请的空间了,所以会有问题。改为:
a=(char *)malloc(100);
strcpy(a, "12s");

即可。

内存泄漏的问题,这位已经说明白了。

针对第二个例子说下。
int output(char *a)
{
a=(char *)malloc(100);
a[0]='1';
a[1]='2';
a[2]='s';
a[3]='\0';
// a="12s";
printf("%s",a);
free(a);
return 0;
}
int main()
{
char *b;
output(b);
return 0;
}

字符串需要带字符串截止符'\0';

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧