典型的例子有四个,其中一个是错误的,先说错误的情况
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;
}
全局变量作用域在整个文件,自然不存在参数传递之类的问题。