【问题标题】:Data and Stack Section [duplicate]数据和堆栈部分 [重复]
【发布时间】:2021-06-15 21:14:26
【问题描述】:

最近遇到了一个小问题,困扰了我好一阵子,但也得到了一些解释。虽然还是有点混乱。

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();
}

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

【问题讨论】:

  • 一定要提高编译器的警告级别,一个不错的会发出这个错误的诊断。

标签: c heap-memory stack-memory


【解决方案1】:

这里:

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

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

但是在这里:

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

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

【讨论】:

  • 在第一个示例中对str 的声明使用static 修饰符可以绕过它。
  • 这完全有道理。刚刚经历了 K&R ,第 5.5 节。谢谢
猜你喜欢
  • 2011-12-01
  • 2011-04-13
  • 2011-09-25
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2012-06-26
  • 2012-07-19
相关资源
最近更新 更多