返回对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++中的静态变量。 我想如果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的指针时,如下所示:

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的语义相关 关键词:

  • 静态局部变量,通常为作用域,但具有静态 存储持续时间(相对于 声明的自动局部变量 (使用自动关键字)

  • 静态全局变量,具有通常的静态存储持续时间,但 其作用域为其所在的文件 定义(相对于外部 用extern声明的变量 关键词)

  • 所以。您声明的静态变量的作用域是正常的-它们的作用域仍然在各自的函数中,并且在这些函数之外不可用

    您仍然可以返回指针,但它们实际上没有任何意义

    编辑:

    也来自:

    全局函数中的静态局部变量可以 被认为是全局变量, 因为它们的价值还在记忆中 为了节目的生命。这个 唯一的区别是它们只是 可访问(即范围)到一个 功能

    为我工作

    #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 ;
    }
    

    这将起作用,因为字符串将存储在“堆”上,即可执行映像的读/写部分。

    只是为了让您知道这些是指针,而不是引用。是的,您展示了这一点是件好事,因为大多数人没有意识到您可以做到这一点。