返回前可用内存

时间:2017-09-14 01:12:38

标签: c memory free

假设我有以下程序

#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编译器好吗?

2 个答案:

答案 0 :(得分:3)

当你调用free(myString)时,myString指向的内存被释放,但myString的值保持不变,使得myString成为一个悬空指针。访问已释放的内存可能会产生未定义的行为。

Using pointer after free()

答案 1 :(得分:0)

  

为什么这会成功打印&#34;你好&#34;什么时候我在回来之前自由了?

守则违反了规则。

myString之后尝试使用free(myString)中的先前值未定义行为(UB)。 @Lee Daniel Crocker

一个可能的UB是数据将在稍后存在。

  

我认为它不会打印任何东西

这将是定义的行为,但这是UB。可能没有任何东西可以打印,代码会出错,永远旋转循环,或者....

是UB。

Using pointer after free()是一个很好的问题/答案。将其移至维基