代码之家  ›  专栏  ›  技术社区  ›  sud03r

函数返回的字符串文本的生存期

  •  25
  • sud03r  · 技术社区  · 14 年前

    考虑这个代码:

    const char* someFun() {
        // ... some stuff
        return "Some text!!"
    }
    
    int main()
    {
       { // Block: A
          const char* retStr = someFun();
          // use retStr
       }
    }
    

    someFun() ,在哪里 "Some text!!" 范围 一生?

    记忆会指向 retStr

    4 回复  |  直到 8 年前
        1
  •  46
  •   anon anon    14 年前

    C++标准没有说明应该存储字符串文本。但是,它确实保证了它们的生命周期就是程序的生命周期。因此,您的代码是有效的。

        2
  •  32
  •   AnT stands with Russia    14 年前

    这个 "Some text!!" 没有一个 . 范围 命名 实体。更确切地说,它是名称本身的属性。 无名的 对象-字符串文本。它没有名字,因此任何关于它的“范围”的讨论都毫无意义。它没有范围。

    你想问的不是 范围 储存时间 属于 “一些文字!!” . C/C++中的字符串文字具有 “一些文字!!” 永远不会被释放。

    请记住(作为旁注),字符串文字是不可修改的对象。写入那个存储器是非法的。

        3
  •  5
  •   osgx    14 年前

        4
  •  -3
  •   N 1.1    14 年前

    retStr所指向的内存会在整个程序中被占用还是在块A退出后被释放?

    编辑:

    会的 释放了,但是 retStr 将不可用(块范围)

    const char *ptr;
    {   
       const char* retStr = "Scope";
       ptr = retStr;
    }   
    
    printf("%s\n", ptr); //prints "Scope"
    
    //printf("%s\n", retStr); //will throw error "retStr undeclared"