数据和堆栈部分

时间:2014-02-25 22:25:20

标签: c stack heap

最近我遇到了一个小问题,困扰了我很长一段时间,但却发现了一些解释。虽然它仍然有点令人困惑。

char *getString()
{
    char *str = "Print Me!";
    return str;
}

int main()
{
   printf("%s", getString());
   getchar();
   return 0;
}

输出为:       Print Me!

虽然

  char *getString()
 {
     char str[] = "Print Me!";    
     return str;
  }
 int main()
{
    printf("%s", getString());
    getchar();
}

给出垃圾值。为什么会这样。

1 个答案:

答案 0 :(得分:2)

下面:

char *getString()
{
    char str[] = "Print Me!";    
    return str;
}

您正在返回具有自动存储持续时间的对象。对象的生命周期是声明它的块。因此,在函数返回后,您的对象将被销毁并尝试访问,从而调用未定义的行为。

但是在这里:

char *getString()
{
    char *str = "Print Me!";
    return str;
}

str指针指向字符串文字,字符串文字具有静态存储持续时间。具有静态存储持续时间的对象的生命周期是程序的整个生命周期。然后完美地定义函数返回后访问字符串文字。