请教一下,以下C代码会有什么问题,会有内存泄露吗?

ffzzyy 2004-07-23 06:41:55
小弟新学C希望大家指点以下,非常感谢。

不包括检查内存益处。

void printvalue (const char *a)
{
char *b;
b=(char *)malloc(sizeof(char)*strlen(a)+1);
strcpy(b,a);
printf("%s\n",b);
return;
}

用这种方式:strcpy有什么问题

char *a[]="12345678";
char *b;

strcpy(b,a);

如果在b的声明该为char *b=NULL;
是不是可以防止野指针。


还有一个程序


void main(){
char *b=NULL;
b=getvalue();
//可以不需要free吗?如果不的话是否有内存泄露。如果getvalue不是在main中调用,是在其他的函数中呢?
free(b);
b=NULL;
}

char *getvalue(){
char *a;
char *b[]="123456789";
a=(char*)malloc(sizeof(char)*strlen(b)+1);
strcpy(a,b);
return a;

}

谢谢大家。

请教一下,以下C代码会有什么问题,会有内存泄露吗?
...全文
139 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
demo001 2004-07-24
  • 打赏
  • 举报
回复
第二个问题比较有意思
whyglinux 2004-07-23
  • 打赏
  • 举报
回复
>> strcpy(b,a);
>> 如果在b的声明该为char *b=NULL;
>> 是不是可以防止野指针。

b 用 NULL 初始化之后已经不是野指针了。但是,至于以后 b 是否为野指针,却不是你现在就能控制的,这跟以后的操作有关。例如,你已经回收了 b 指向的内存空间而没有给 b 赋值的话,b 就编程了所谓的野指针。

b 初始化为 NULL 之后的好处就是:现在你程序执行到 strcpy(b,a); 这里,程序一定会出现运行错误,从而使你知道程序中存在着 Bug(因为你没有为 b 分配其指向的空间)。如果 b 不初始化,则其指向的空间不定,程序运行可能出错,也可能表现正常,这不利于发现错误。

>> char *b=NULL;
>> b=getvalue();
>>//可以不需要free吗?如果不的话是否有内存泄露。如果getvalue不是在main中调用,是在其他的函数中呢?

是否需要释放 b 指向的内存是由 getvalue() 函数的实现决定的。有两种情况:

1. 如果 b 指向的内存是动态分配的(用 new 或者 malloc()),则用完之后应该释放内存(相应地用 delete 或者 free()),否则会造成内存泄漏。

2. 如果 b 指向的内存是 static 内存,即类似 static char str[128]; 这样定义的内存,则不需要也不能师范内存。
fanbest 2004-07-23
  • 打赏
  • 举报
回复

内存分配时并不是只分配你想要的大小,通常比你需要的要大一些.

那大出来的部分是编译器用来检查有无内存泄漏的;

所以第三段程序应该是对的,释放内存可以在任何函数中释放;
sssqin 2004-07-23
  • 打赏
  • 举报
回复
第二个是一样的道理
sssqin 2004-07-23
  • 打赏
  • 举报
回复
第一个程序会造成内存泄露
因为你malloc一个指针后,在程序结束之前并没有free它。
记住:动态分配的指针一定要靠自己释放,系统不会自动释放它

69,373

社区成员

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

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