c语言函数内为外部分配空间问题

来源:互联网 发布:淘宝抢红包软件被骗 编辑:程序博客网 时间:2024/06/05 08:01

在很多情况下我们都会把关于一些内存的操作的步骤给封装起来,这样会带来很大的好处,方便我们使用,下面谈一个经常可能会犯的低级错误。这种情况是假如我想把初始化某一部分的操作封装成这样的函数void Init(char* p) 很有可能我们会这样做:
void Init(char* p) {          p = (char *) malloc(sizeof(char)*MAX);          .........}

其实这样的做法是错误的,如果这样写的话,你和下面的代码又有什么区别呢?

void Init(int a) { int b = 0; a = b;}

有人说 有区别阿 我分配了内存空间,并且赋值给p了啊?  我们可以这样想一下malloc 以后返回的值不就是一个变量吗?其实和b 是一样的 只不过是一个指针变量而已,其实还是一个变量而已。 那个 Init( char* p)  这里面的p其实只是在外部调用的那个char指针的一个变量拷贝而已,你在函数体对这个变量的赋值是不会对被拷贝的那个char指针变量产生任何影响的,就像很经典的指针传值问题一样。 那麽有人问我该怎么在函数体内对外部指针变量进行空间分配呢? 我们可以参考一下以前经典的指针传值嘛,对指针变量进行操作修改是一样的嘛,聪明的人马上就会想到  加个地址不就完了麻,对 正确的写法如下所示:

void Init(char** p) {           *p = (char *)malloc(sizeof(char)*MAX);               .............}


这样写才是正确的,而第一种只会产生内存泄漏。请大家不要犯这样低级的错误。