2

我不明白为什么整个事情都不起作用。

我只想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;
}
4

3 回答 3

4
char *p;

使指针指向main(),您可以将其传递给另一个函数,但是您通过值传递它,因此您对它所做的任何更改(例如更改其指向的内容)超出范围。不会“坚持” .

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

func(&p);

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

int func(char **p)
于 2012-11-24T14:22:39.423 回答
3

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

你有两个解决方案:

  1. 传递一个指向指针的指针,一个 char **p,然后 do *p = malloc(1),然后 func 将接受一个 char **p
  2. 返回分配的变量 un func 并分配它: p = func();
于 2012-11-24T14:11:34.177 回答
3

传入&pmain 意味着调用 funcfunc(&p) 将函数签名更改func(char *p)func(char **p)

pinfunc是本地的,所以funcfunc退出时它被破坏并导致内存泄漏。

在 main 中,您正在释放一个未指向由 分配的内存的指针,malloc在这种情况下也是calloc如此,并且它没有释放您分配的内存,因此它是内存泄漏free(p)Undefined behaviourfunc

第一种方法:

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);
}
于 2012-11-24T14:14:02.687 回答