这个问题只是为了我更好地理解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';
两者都是未定义的行为,并且在某些平台上会崩溃(很好!)。
Edit:请注意,字符串文字在 C++ 中具有 const 类型(在 C 中则不然):char const[N]
。对指向非常量字符的指针的赋值会触发不推荐使用的转换(无论如何,一个好的实现都会发出警告)。因为上面写的是 const 数组won't触发该转换,代码将错误编译。真的,你的代码正在这样做
((char*)"hello")[0] = '5';
((char*)"why am I not legal?")[0] = '5';
Read C++ strings: [] vs * https://stackoverflow.com/questions/308279/c-strings-vs/308724#308724
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)