关于C语言函数内部内存分配的几个问题~~

我的工作环境是C而不是C++,所以回答C++的同学抱歉了~~~问题有点复杂,我尽量描述得清楚一点,谢谢:1.对于在函数内部使用malloc进行内存分配,很多地方建议使用a... 我的工作环境是C而不是C++,所以回答C++的同学抱歉了~~~问题有点复杂,我尽量描述得清楚一点,谢谢:

1.对于在函数内部使用malloc进行内存分配,很多地方建议使用assert进行有效性检验。但是assert只在DEBUG模式起作用,如果程序将来的RELEASE版本在运行中出现内存不足等情况导致malloc失败怎么办?所以我想是不是还是保留使用if检验更保险,比如如下的使用方法:
int *p = (int *)malloc(……);
if ( p == NULL ) return 0; // 返回函数调用处

2.malloc函数分配内存失败能否free?这个好像看到有不同的说法,这里希望确认下;

3.如果malloc失败后不能free掉指针,那如果函数中连续多次使用malloc分配内存,在对指针进行有效性检验时就只能够逐个检验指针的有效性,而不能像下面这样:
if( ( p1 == NULL )||( p2 == NULL ) )
{
free(p1);
free(p2);
return 0;
}
应该改为:
if(p1== NULL) return 0;
if(p2 == NULL)
{
free(p1);
p1 = NULL;
return 0;
}
这样的处理可不可以?或者实际中还有什么更好的办法没有??

再次感谢~~~~
展开
 我来答
匿名用户
2011-06-29
展开全部
1、可以用if代替assert断言。

2、如果空间够,分配就会失败,malloc()会返回一个NULL指针。而free()函数对空指针没有作用(相当于不调用free()函数)

3、如果分配失败,就不用作清理工作(比如调用free()函数)。
大雅新科技有限公司
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,... 点击进入详情页
本回答由大雅新科技有限公司提供
furious_tauren
2011-06-29 · TA获得超过4055个赞
知道大有可为答主
回答量:1913
采纳率:100%
帮助的人:768万
展开全部
1、可以用if代替assert断言:但是malloc在用户空间分配内存几乎不会失败,编程时你应该知道划分多大内存是保险的, 如果你划分的很大很大,即使是用了 if语句执行失败返回那也是失败了,对你程序来说没有任何意义。因为即使你不使用if语句,操作系统也会给你贴出个oops,告诉你你内存泄露了。
所以说,检查malloc成败只在调试阶段有用的。

2, 如果你malloc失败就根本没用告诉操作系统要保留某段内存,那也就根本不用free了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户26212
2011-06-30 · TA获得超过224个赞
知道答主
回答量:447
采纳率:100%
帮助的人:252万
展开全部
void getmo(char *p)
{
p=(char*)malloc(10);
int i = 0;

}
void main()
{
char *str;
getmo(str);//传递了一个指针到函数,函数内部不能改变原来的指针本身,只能改变指针指向的内容
//换句话说,getmo() 函数调用时,将str指针赋给了形参p
//函数getmo()内部也没有改变p 指向的内容(等同于str指向的内容)
//但当getmo() 返回时,p并未将其值赋给str ,所以原来的str并没有改变
memcpy(str, "11111", 6);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式