这个问题只是为了让我更好地理解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++ - 在 C++ 中返回对静态局部变量的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/959951/