问题描述
下面,我正在使用功能 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
,对其取消引用(就像在程序中一样)是未定义的行为