假设我有以下程序
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *returnSomething()
{
char *myString;
myString = malloc(sizeof(char) * 50);
strcpy(myString,"hello");
free(myString);
return myString;
}
int main(int argc, char const *argv[])
{
char *myString = returnSomething();
printf("%s",myString);
return 0;
}
为什么在返回之前我将其解冻后会成功打印“你好”?我认为它没有打印任何东西,因为我释放了内存然后返回字符串。我以为在打印之后我总是不得不把它释放出来。
这只是我的mac编译器好吗?
答案 0 :(得分:3)
当你调用free(myString)时,myString指向的内存被释放,但myString的值保持不变,使得myString成为一个悬空指针。访问已释放的内存可能会产生未定义的行为。
答案 1 :(得分:0)
为什么这会成功打印&#34;你好&#34;什么时候我在回来之前自由了?
守则违反了规则。
在myString
之后尝试使用free(myString)
中的先前值未定义行为(UB)。 @Lee Daniel Crocker
一个可能的UB是数据将在稍后存在。
我认为它不会打印任何东西
这将是定义的行为,但这是UB。可能没有任何东西可以打印,代码会出错,永远旋转循环,或者....
是UB。
Using pointer after free()是一个很好的问题/答案。将其移至维基