我无法理解为什么整件事都行不通。
我只想在函数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;
}
答案 0 :(得分:4)
char *p;
创建一个指向main()的本地指针,你可以将它传递给另一个函数,但是你按值传递它,所以你对它做的任何改变(比如改变它指向的东西)都在scope.won't之外“棒”。
解决方案是将指针传递给指针,或简单地传递p:
的地址func(&p);
但不要忘记更改func()的参数列表!
int func(char **p)
答案 1 :(得分:3)
在func中,p是传递给它的指针的副本,因此在func中创建p并在func完成时删除。
您有两种解决方案:
*p = malloc(1)
,然后func将接受char ** p 答案 2 :(得分:3)
在主要方式中传递&p
将调用func称为func(&p)
将func(char *p)
的功能更改为func(char **p)
p
中的func
是func
的本地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}}