这是我的代码的一个简短示例:
#include <stdio.h>
#include <stdlib.h>
void m(void * x) {
x = malloc(100);
}
int main(int argc, char *argv[])
{
int *ptr;
m(ptr);
if (ptr == NULL) {
return 1;
}
free(ptr);
m(ptr);
if (ptr == NULL) {
return 1;
}
free(ptr);
return 0;
}
如您所见,我正在将内存分配给函数内部的指针。 编译器显然不知道我正在分配内存,并且还对其进行错误检查。
因此,在第二次释放之前,内存被取消分配和不可释放的可能性为 0。
但是我收到错误,指针可以在释放后使用。
为了解决这个问题,我必须在每次免费后继续发送垃圾邮件
ptr = NULL;
;
最初我以为我可以给函数一个未初始化的变量,但显然不行,所以我不得不将 NULL 分配给初始声明。
但是,我假设后面的 ptr 实例内部有一些残留地址。
这是函数不接受新释放/未初始化的指针的问题,还是编译器无法理解我 malloc 并检查释放之间的指针,或两者,或其他原因?
x
是局部变量,您在函数中分配的内容在 m
函数作用域之外不可见。
要修改传递的指针,您需要传递对指针的引用(即指针到指针)。
void m(int **x) {
*x = malloc(100);
}
(旁注):100 是
char
s 中的大小,而不是 int
s 中的大小