函数返回的Malloc内存未释放

问题描述

下面,我正在使用功能 input 来收集字符串并将其返回给功能 main 。 我将返回的指针/字符串存储在char *中,并在使用该变量后释放了已分配的内存。

但是,在我的免费调用之后,似乎已分配的内存仍然可用。

char* input();
const int MAX = 100;

int main() {
    while(1) {
        char * input_function_pointer = input();

        printf("%p",&input_function_pointer);
        puts(input_function_pointer);   
        
        free(input_function_pointer);
        puts("_______");

        printf("%p",&input_function_pointer);
        puts(input_function_pointer); 
        puts("_______");
    }
return 0;
}

char* input() {
   char * str = malloc(MAX);
   printf( "Enter a value :");
   fgets( str,MAX,stdin );
return str;
}

解决方法

释放内存不会强制擦除其内容(取决于编译器选项,多数情况下已打开调试功能),并且没有任何阻止您访问该空间的内容。您正处于未定义行为的状态,正在访问所谓的“悬空指针”:释放内容后,您仍可能会看到相同的内容,而在其他malloc被称为...或崩溃之后,您可能不会看到相同的内容。

释放内存只是将该空间标记为可分配的空间,并不阻止进一步的读取(或写入)访问。这也是(也是)为什么C被视为“低级”。

,

如果在free设置内存后尝试访问该内存,则无法保证会发生什么。这是未定义的行为,在这种情况下,恰好适用于您的特定编译器。

,

7.22.3.3免费功能c11

free函数使ptr指向的空间为 解除分配,即可供进一步分配

取消引用dangling pointer会引起未定义的行为。

,

free不会修改释放的内存的内容。它也不会更改指针。

包含对已释放内存的引用的指针称为 dangling pointer ,对其取消引用(就像在程序中一样)是未定义的行为

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...