30

考虑这段代码:

const char* someFun() {
    // ... some stuff
    return "Some text!!"
}

int main()
{
   { // Block: A
      const char* retStr = someFun();
      // use retStr
   }
}

在函数someFun()中,存储在哪里"Some text!!"(我认为它可能在 ROM 的某个静态区域中)以及它是什么范围寿命?

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

4

4 回答 4

47

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

于 2010-04-05T17:37:35.843 回答
32

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

您似乎要问的不是范围。它是生命周期存储"Some text!!"期限。C/C++ 中的字符串文字具有静态存储持续时间,这意味着它们“永远”存在,即只要程序运行。所以,占用的内存"Some text!!"永远不会被释放。

请记住(作为旁注)字符串文字是不可修改的对象。写入该内存是非法的。

于 2010-04-05T17:47:48.067 回答
5

字符串将静态存储在程序二进制文件的特殊(通常在现代操作系统上为只读)部分中。它的内存未被分配(单独为字符串,仅在将其加载到内存时用于总部分)并且不会被释放。

于 2010-04-05T17:36:47.533 回答
-3

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"
于 2010-04-05T17:57:37.517 回答