繁体   English   中英

函数返回的字符串文字的生命周期

[英]Lifetime of a string literal returned by a function

考虑以下代码:

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

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

someFun()函数中, "Some text!!"在哪里? 存储(我认为它可能在ROM的某些静态区域中),它的作用是什么 范围 一生?

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

C ++标准未说明应将字符串文字存储在何处。 但是,它的确保证了它们的生命周期是程序的生命周期。 因此,您的代码是有效的。

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

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

只需记住(作为补充说明)字符串文字是不可修改的对象。 写入该内存是非法的。

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

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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM