返回对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 ) ; } #包括 char*非法() { char*word=“你好”; 返回词; } char*alsoNotLegal() { static char*word=“为什么我不合法?”; 返回词; } int main() { //我知道这是违法的 //char*ill=非法(); //ill[0]=“5”; //放(病); //但这是为什么呢?我认为静态变量应该永远“存在”- char*leg=alsoNotLegal(); 腿[0]=“5”; 放(腿); }
定义并初始化指向char的指针时,如下所示:返回对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 ) ; } #包括 char*非法() { char*word=“你好”; 返回词; } char*alsoNotLegal() { static char*word=“为什么我不合法?”; 返回词; } int main() { //我知道这是违法的 //char*ill=非法(); //ill[0]=“5”; //放(病); //但这是为什么呢?我认为静态变量应该永远“存在”- char*leg=alsoNotLegal(); 腿[0]=“5”; 放(腿); },c++,C++,定义并初始化指向char的指针时,如下所示: char * word = "hello"; 实际上,您是在告诉编译器将固定字符串“hello”放入某个固定的存储器中,然后创建word指针变量指向它 尽管您将word变量更改为指向其他对象,并且如果它指向某个可变存储,您可以通过*和[]运算符更改它指向的对象,但不允许通过它更改固定字符串“hello” C++允许将固定字符串分配给指向非常量char的指针,纯粹是为了向后兼容。最好只将这些字符串分配给指向const char的指针。e、 g con
char * word = "hello";
实际上,您是在告诉编译器将固定字符串“hello”放入某个固定的存储器中,然后创建word
指针变量指向它
尽管您将word
变量更改为指向其他对象,并且如果它指向某个可变存储,您可以通过*和[]运算符更改它指向的对象,但不允许通过它更改固定字符串“hello”
C++允许将固定字符串分配给指向非常量char
的指针,纯粹是为了向后兼容。最好只将这些字符串分配给指向const char
的指针。e、 g
const char * word = "hello";
这样,您就可以通过编译时类型检查来防止导致非法的运行时行为
编辑:
在您的示例中,将局部变量声明为static和not之间本质上没有外部可见的区别。这会影响每个函数中指针变量的生存时间。它不会影响指针变量指向的固定字符串的生存期。当函数返回指针变量的值(C++返回值总是值)时,函数中的指针变量是否在函数的末尾被破坏并不特别重要。字符串本身将始终超出函数的范围,因为字符串文字具有静态存储持续时间。您的静态是常量字符串文字。你不应该修改它。某些编译器可能允许您执行以下操作。如果您的static是std::string,那么您可以从调用者处修改它。这两个函数本身并不非法。首先,在这两种情况下都返回指针的副本,该指针指向具有静态存储持续时间的对象:字符串文本将在整个程序持续时间内有效 但是您的
main
函数都是关于未定义的行为的。您不允许写入字符串文字的内存:)您的主函数所做的可以简化为等效的行为
"hello"[0] = '5';
"why am I not legal?"[0] = '5';
两者都是未定义的行为,在某些平台上会崩溃(很好!)
<> > > >编辑< /强>:注意,字符串文字在C++中有一个const类型(C中不是这样):<代码> char const [n] < /代码>。分配给指向非常量字符的指针会触发不推荐的转换(好的实现无论如何都会对此发出警告)。因为上面对const数组的写入不会触发该转换,所以代码将编译错误。真的,你的代码就是这样做的
((char*)"hello")[0] = '5';
((char*)"why am I not legal?")[0] = '5';
只读取指针是静态的,它指向一个常量字符串。执行leg[0]=“5”不正常,因为它会修改常量字符串 在这种情况下,静态影响很小,实际上是一样的:
char* alsoNotLegal()
{
return "why am I not legal?";
}
发件人:
C语言及其应用
子体,术语静态变量
至少有两个特定的和
本质上不相关的含义,每一个
与C的static的语义相关
关键词:
#include<iostream>
using namespace std;
char* legal() {
char* word = "helllo";
return word;
}
char* alsoLegal() {
static char* word = "hello!";
return word;
}
int main(){
cout << legal() << endl;
cout << alsoLegal() << endl;
return 0;
}
#包括
使用名称空间std;
char*legal(){
char*word=“helllo”;
返回词;
}
char*alsoLegal(){
静态字符*word=“你好!”;
返回词;
}
int main(){
你可能想要的是:
char* alsoNotLegal()
{
static char[] word = "why am I not legal?" ;
// static char* x = "X"; <- Not good.
// static const char* y = "Y"; <- Good. As the compiler will warn you about
// Illegal attempts to modify it.
return word ;
}
char*alsoNotLegal()
{
static char[]word=“为什么我不合法?”;
//静态字符*x=“x”这些“即时”字符串存储在Windows上PE的只读“r”部分。这就是为什么在尝试写入该位置时会出现操作系统异常
如果您有Ollydbg或读取反汇编输出,则可以看到字符串位于RDATA部分(只读数据部分)。
如果它是存储在堆上的常规字符串,则不会有问题
char* alsoNotLegal()
{
static char word[] = "why am I not legal?" ;
return word ;
}
这将起作用,因为字符串将存储在“堆”上,即可执行映像的读/写部分。只是为了让您知道这些是指针,而不是引用。是的,您展示了这一点是件好事,因为大多数人没有意识到您可以做到这一点。