【问题标题】:what happen to memory assigned to a string addressed by a pointer when that pointer points to a new string?当指针指向新字符串时,分配给由指针寻址的字符串的内存会发生什么?
【发布时间】:2018-06-12 06:19:25
【问题描述】:
    char *p = "hello";
    p = "hello_2";

这里字符串“hello”存储在内存中,它的地址存在于指针“p”中,但是当这个指针开始指向字符串“hello_2”时,存储字符串“hello”的内存会发生什么?它会被释放还是这个字符串仍然存在但我们无法访问它?

【问题讨论】:

  • 编译器很可能会检测到第一个文字没有做有意义的事情,并将整个代码替换为char *p = "hello_2";
  • 防止修改你想要的字符串常量const char *p = "hello";如果你打算改变它指向的字符串,只声明一个非常量字符指针。

标签: c string pointers


【解决方案1】:

您拥有的是一个字符串常量,它存储在只读内存中。 所以这个内存不需要使用free()显式释放

在变量p 的生命周期有效之前,您可以访问存储的字符串。

【讨论】:

  • 我认为您的意思是“只要”或者“同时”而不是“直到”。
【解决方案2】:

内存不会被释放。但不会(在这种情况下)丢失。代码知道字符串的位置,并在每次运行片段时使用它来分配指针 p。

  • 确实需要释放堆上的内存(mallocstrdup 的结果)。

  • 不需要释放堆栈上的内存。

  • 不需要释放静态内存(本例)。

【讨论】:

    【解决方案3】:

    您实际上是在创建一个名为 "hello" 的字符串文字,将其分配到内存中的某个位置,并将文字的第一个字符的地址分配给指针 p,并且由于指针不是常量,您可以再次分配它有不同的地址。还有一点需要注意的是,创建的字符串字面量在只读内存中。

    【讨论】:

      【解决方案4】:

      全局变量、堆、代码和字符串字面量都存在不同的内存部分。它特定于所使用的编译器。

      gcc 创建一个 .rodata 部分,它是一个只读部分,字符串文字存储在那里。

      Visual C++ 为只读部分创建一个 .rdata 部分。

      您可以使用 objdump(在 linux 上)检查二进制文件的不同部分。

      【讨论】:

        猜你喜欢
        • 2011-12-03
        • 1970-01-01
        • 2021-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        相关资源
        最近更新 更多