“指针可以在释放后使用”错误没有看到我正在为指针分配内存

问题描述 投票:0回答:1

这是我的代码的一个简短示例:

#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 并检查释放之间的指针,或两者,或其他原因?

c
1个回答
0
投票

x
是局部变量,您在函数中分配的内容在
m
函数作用域之外不可见。

要修改传递的指针,您需要传递对指针的引用(即指针到指针)。

void m(int **x) {
    *x = malloc(100);
}

(旁注):100 是

char
s 中的大小,而不是
int
s

中的大小
© www.soinside.com 2019 - 2024. All rights reserved.