【问题标题】:Pointers To Const Char指向常量字符的指针
【发布时间】:2013-08-02 22:27:27
【问题描述】:

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

const char * ptr = "String one";

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

ptr = "String two";

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

【问题讨论】:

  • 字符串字面量是静态分配。他们不需要被释放。
  • 为什么要释放它?指针只是指向不同的字符串文字,正如接受的答案中所解释的,字符串文字具有静态存储持续时间,因此它们没有被释放。

标签: c pointers char string-literals


【解决方案1】:

标准只说字符串字面量有静态存储时长,也就是说变量的生命周期一直到程序结束,程序启动时才被初始化。 C11 draft standard 中的相关部分是6.4.5 段落6

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

它可能在只读内存中,并且可能是,但这是实现定义的。它不需要被释放,只有通过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. 

你可以自己运行here

【讨论】:

  • 所以程序关闭时会自动从内存中删除?
  • @2013Asker 是的,当你的程序退出时,它会向系统释放资源。
  • 在典型的托管实现中,字符串文字可能会在被操作系统标记为只读的内存中,而不是在物理 ROM 中,并且当程序结束。在独立实施中,情况可能不同;一个非常低级的系统可能只运行一个程序,其代码和静态数据存储在永远不会被擦除的 ROM 中。
猜你喜欢
  • 2020-03-25
  • 2020-10-23
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 2016-12-30
  • 2013-01-04
  • 1970-01-01
  • 2014-02-23
相关资源
最近更新 更多