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

时间:2021-08-27 18:51:12

典型的例子有四个,其中一个是错误的,先说错误的情况

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;

}

全局变量作用域在整个文件,自然不存在参数传递之类的问题。