高分再请教C语言笔试题目3,100%处理:)

来源:百度知道 编辑:UC知道 时间:2024/06/08 10:59:20
下面这段程序会不会出现内存泄露,隐患在哪里,如何修改?

void a(char *buf)
{

char *a=(char*)malloc(255);
if(buf==NULL)
return;
else

{

……

}
}

分数是次要的,真的很感谢你们的帮助~~~~多谢大家~~~
看来问题比较初级,大家回答的都算正确。

谁再能解释清楚WXD11011的答案里第二个free(a);的必要性,今天我就手工了,收获很大啊,呵呵

void a(char *buf)
{

char *a=(char*)malloc(255);
if(buf==NULL)
{
free(a);
return;
}
else

{

……
//如果内部有return ,应该在return之前free(a);

}
free(a);//如果else{...}内部没有return,则可以在else块的结尾用free(a)或者在此处用free(a);
}

**********************************

如果经常阅读别人的代码的话,应该看到,这种情况比较好的编程习惯是在程序的最后做清理工作:
你的代码可以如下写法:
void a(char *buf)
{

char *a=(char*)malloc(255);
if(buf==NULL)
goto CLEAR;
else

{

……
//中间有任何异常,都调用goto CLEAR;

}
CLEAR:
if(a)
free(a);
//其他清理工作都可放在这里
}

void a(char *buf)
{

char *a=(char*)malloc(255);
if(buf==NULL) {
free(a);
return;
}
else

{

……

}
}
总之return前free

会 因为你用了动态分配内存但是你没有动态的回收内存空间 不关最后是不是有返回语句return

你用完了要free(a)啊

问题涉及到的就是内存的使用上,一句话就是:动态内存的申请与释放必须