12

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

const char * ptr = "String one";

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

ptr = "String two";

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

4

1 回答 1

7

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

[...]然后使用多字节字符序列来初始化一个静态存储持续时间和长度的数组,该数组刚好足以包含该序列。[...]

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

如果我使用这个程序:

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

    return 0;   
}

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

objdump -s -j .rodata a.out

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

Contents of section .rodata:
  400580 01000200 53747269 6e67206f 6e6500    ....String one. 

你可以在这里自己运行

于 2013-08-01T20:09:03.547 回答