c++ - 在 C++ 中返回对静态局部变量的引用

标签 c++

这个问题只是为了让我更好地理解C++中的静态变量。

我想我可以在 C++ 中返回对局部变量的引用,如果它被声明为静态的话,因为该变量应该在函数返回后继续存在。为什么这行不通?

#include <stdio.h>
char* illegal()
{
  char * word = "hello" ;
  return word ;
}

char* alsoNotLegal()
{
  static char * word = "why am I not legal?" ;
  return word ;
}


int main()
{
  // I know this is illegal
  //char * ill = illegal();
  //ill[ 0 ] = '5' ;
  //puts( ill ) ;

  // but why is this? I thought the static variable should "live on" forever -
  char * leg = alsoNotLegal() ;
  leg[ 0 ] = '5' ;
  puts( leg ) ;
}

最佳答案

这两个函数本身并不违法。首先,在这两种情况下,您都返回一个指针的拷贝,该指针指向一个具有静态存储持续时间的对象:字符串文字将在整个程序持续时间内存在。

但是您的main 函数是关于未定义行为的。您不允许写入字符串文字的内存 :) 您的 main 函数所做的可以简化为等效的行为

"hello"[0] = '5';
"why am I not legal?"[0] = '5';

两者都是未定义的行为,并且在某些平台上会崩溃(很好!)。

编辑:请注意,字符串文字在 C++ 中具有 const 类型(在 C 中不是):char const[N]。您对指向非常量字符的指针的分配会触发弃用的转换(无论如何,一个好的实现会警告)。因为上面对常量数组的写入不会触发该转换,所以代码会编译错误。真的,您的代码正在执行此操作

((char*)"hello")[0] = '5';
((char*)"why am I not legal?")[0] = '5';

阅读C++ strings: [] vs *

关于c++ - 在 C++ 中返回对静态局部变量的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/959951/

相关文章:

c++ - 关于 C++ 定时器的问题

c++ - 在 Direct3D (DirectX) 应用程序中禁用 alt-enter

c++ - 对 android_main 的 undefined reference (Android NDK - native_app_glue)

c++ - std::绑定(bind) "no matching function for call"

c++ - doxygen 中的方程式

c++ - 按名称设置类成员值

c++ - 如何解决忙等待许多正在运行的线程

c++ - 映射/设置迭代器不可递增

C++,FFMpeg : Unable to find any decoder or encoder

c++ - C 字符串是否保证是数组?