指向Const Char的指针

201*_*ker 12 c pointers char string-literals

以下代码指向只读内存中可用的char数组中的第一个字符.是对的吗?:

const char * ptr = "String one";
Run Code Online (Sandbox Code Playgroud)

现在当ptr开始指向另一个内存位置时:

ptr = "String two";
Run Code Online (Sandbox Code Playgroud)

第一个char数组会发生什么?执行结束时是否释放了该内存位置?

Sha*_*our 7

该标准仅表示字符串文字具有静态存储持续时间,这意味着变量的生命周期直到程序结束并且在程序启动时初始化.C11标准草案的相关部分是6.4.56段:

[...]多字节字符序列然后用于初始化静态存储持续时间和长度的数组,足以包含序列.[...]

它可能在只读存储器中,可能只是实现定义.它不需要被释放,只有通过malloc后续调用动态分配的内存free.

如果我使用这个程序:

int main()
{
    const char * ptr = "String one";

    return 0;   
}
Run Code Online (Sandbox Code Playgroud)

然后我们用它构建它gcc然后使用objdump:

objdump -s -j .rodata a.out
Run Code Online (Sandbox Code Playgroud)

我们会发现在这种情况下它确实存储在只读数据部分:

Contents of section .rodata:
  400580 01000200 53747269 6e67206f 6e6500    ....String one. 
Run Code Online (Sandbox Code Playgroud)

您可以自己运行它在这里

  • 在典型的托管实现中,字符串文字可能会在内存中被操作系统标记为只读,而不是在物理ROM中,并且程序完成后几乎肯定会释放所有程序的内存.在独立实施中,它可能是一个不同的故事; 一个非常低级的系统可能只运行一个程序,其代码和静态数据存储在永不擦除的ROM中. (4认同)