Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数返回的字符串文本的生存期_C++_C_Lifetime_String Literals - Fatal编程技术网

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

C++ 函数返回的字符串文本的生存期,c++,c,lifetime,string-literals,C++,C,Lifetime,String Literals,考虑以下代码: const char* someFun() { // ... some stuff return "Some text!!" } int main() { { // Block: A const char* retStr = someFun(); // use retStr } } 在函数someFun()中,“Some text!!”存储在哪里(我想它可能在ROM的某个静态区域),它的作用域寿命是多少 retStr指向的内

考虑以下代码:

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

int main()
{
   { // Block: A
      const char* retStr = someFun();
      // use retStr
   }
}
在函数
someFun()
中,“Some text!!”存储在哪里(我想它可能在ROM的某个静态区域),它的作用域寿命是多少


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

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

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

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

你似乎问的不是范围。它是一些文本的生存期或存储持续时间!!“。C/C++中的字符串文字具有静态存储持续时间,这意味着它们“永远”存在,即只要程序运行。因此,
“某些文本!!”
占用的内存永远不会释放

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

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

编辑:

它将不发布,但
retStr
将不可用。(区块范围)


它将不会被释放,只有符号RETSR将不可用且不正确。retStr在执行后指向的内存是静态内存。它是在应用程序启动时分配的,只有在应用程序终止时才被释放。@all:我错了,我想的是
retStr
。将改变答案。这不一定是真的。如果您链接到的二进制格式不支持“只读节”的概念,该怎么办?(例如,大多数基本COM文件)mamonts也没有只读部分。它们只对历史感兴趣。即使在com文件中,也会有一部分(文件的一部分)或几个用于存储常量。在段或页面描述符中,它们不会被标记为只读,但想法是一样的。这只是一个极端的例子,无法将字符串放入“只读节”(因为没有节)。关键是,这是不可能的,标准没有规定这样的要求,因此,即使有可能,符合要求的编译器/链接器也可能不会这样做。关于COM文件,你绝对错了:COM文件是实模式“内存快照”,甚至连链接器逻辑上放置所有常量的内存区域也不是只读的。Real mode没有任何类似的内存保护功能。你也可以看看这个问题:你能参考(草案)标准吗?
const char *ptr;
{   
   const char* retStr = "Scope";
   ptr = retStr;
}   

printf("%s\n", ptr); //prints "Scope"

//printf("%s\n", retStr); //will throw error "retStr undeclared"