您的位置:首页 > 其它

子函数中为调用者分配内存的一些理解

2014-09-19 23:51 218 查看
典型的例子有四个,其中一个是错误的,先说错误的情况1.错误的例子:intfunc(char *p){if(NULL == (p = (char *)malloc(128)) );{retuen-1;}return0;}在主函数中调用:...char*p0 = NULL;func(p0);…我们知道,对于非全局变量,实参变量对形参变量的数据传递都是单向传递的,只能由实参传递给形参,不能把形参传递给实参。在func中,给形参p分配了内存,即给变量p一个值,这个值是刚分好的内存块的首地址。这里我们并没有对实参p0进行任何操作。


2.通过返回值返回这是正确分配方式之一:char*func(){char*p;if(NULL == (p = (char *)malloc(128)) );{retuenNULL;}returnp;}调用func:...char*p0 = NULL;p0= func();if(NULL== p0)....子函数中动态分配了一块128字节的内存,这块内存在子函数结束时不会被收回,因此我们可以通过返回的指针对它进行操作。


使用完的内存需要释放,这个例子中,只需要调用free(p)即可。例1因为我们不知道分配的内存首地址,无法释放该内存,在7*24小时应用场景中,这种未释放的内存越来越多,最后会导致整个系统无内存可用。
3.使用指向一个指针的指针intfunc(char **p){*p= (char *)malloc(128);if(NULL== *p) return -1;return0;}调用func:...char*p0 = NULL;if(0!= func(&p0);....实参传递的是p0这个针指变量的地址,即指向指针p0的指针,子函数中的形参就可以通过这个地址操作p0,为它分配内存


4.全局变量char*p0 = NULL;intfunc(){if(NULL == (p0 = (char *)malloc(128)) );{retuen-1;}return0;}intmain(){//调用func()if(0!= func(p0)) return -1;...return0;}全局变量作用域在整个文件,自然不存在参数传递之类的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: