函数返回的字符串文字的生命周期
考虑以下代码:
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!!"
占用的内存 从未发布过。
请记住(作为旁注)字符串文字是不可修改的对象。 写入该内存是违法的。
字符串将静态存储在程序二进制文件的特殊(通常是只读的现代操作系统)部分。 它的内存未分配(单独用于字符串,仅在将其加载到内存时用于整个部分)并且不会被释放。
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"