函数中的malloc不能很好地工作

时间:2012-11-24 14:09:48

标签: c ubuntu malloc

我无法理解为什么整件事都行不通。

我只想在函数malloc中执行func,当我从它返回时,malloc消失了......我得到了

  

*检测到glibc ./test:free():指针无效:0xb76ffff4 * *

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <string.h>
#include <errno.h>

int func(char *p) {
    p=(char*)malloc(1);
    *p='a';
    printf("1. p= %c\n",*p);
    return 0;
}

int main()
{
    char *p;

    func(p);
    printf("2. p= %c\n",*p);
    free(p);

    return 0;
}

3 个答案:

答案 0 :(得分:4)

char *p;

创建一个指向main()的本地指针,你可以将它传递给另一个函数,但是你按值传递它,所以你对它做的任何改变(比如改变它指向的东西)都在scope.won't之外“棒”。

解决方案是将指针传递给指针,或简单地传递p:

的地址
func(&p);

但不要忘记更改func()的参数列表!

int func(char **p)

答案 1 :(得分:3)

在func中,p是传递给它的指针的副本,因此在func中创建p并在func完成时删除。

您有两种解决方案:

  1. 将指针传递给指针,char ** p,然后执行*p = malloc(1),然后func将接受char ** p
  2. 返回分配的变量un func并分配它:{​​{1}}

答案 2 :(得分:3)

在主要方式中传递&p将调用func称为func(&p)func(char *p)的功能更改为func(char **p)

p中的funcfunc的本地func所以当malloc退出时会被销毁并导致内存泄漏。

在main中你释放了一个指针,该指针没有指向由calloc分配的内存,free(p)所以Undefined behaviour在这种情况下是func并且它没有释放您在void func(char **p) { *p=malloc(1); //rest of your code here } int main() { int *p; func(&p); // your code here free(p); } 中分配的内存,因此内存泄漏

第一种方法:

**

第二种方法:很容易不使用char * func(char *p) { p=malloc(1); // rest of code here return p; } int main() { char *p; p=func(p); //rest of code here free(p); }

{{1}}