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

我的工作环境是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; }这样的处理可不可以?或者实际中还有什么更好的办法没有??再次感谢~~~~
2026年09月25日 14:38
有3个网友回答
网友(1):

1、可以用if代替assert断言。

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

3、如果分配失败,就不用作清理工作(比如调用free()函数)。

网友(2):

1、可以用if代替assert断言:但是malloc在用户空间分配内存几乎不会失败,编程时你应该知道划分多大内存是保险的, 如果你划分的很大很大,即使是用了 if语句执行失败返回那也是失败了,对你程序来说没有任何意义。因为即使你不使用if语句,操作系统也会给你贴出个oops,告诉你你内存泄露了。
所以说,检查malloc成败只在调试阶段有用的。

2, 如果你malloc失败就根本没用告诉操作系统要保留某段内存,那也就根本不用free了。

网友(3):

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);
}