当指针指向新字符串时,指针指向由字符串寻址的字符串会发生什么?

时间:2018-06-12 06:19:25

标签: c string pointers

    char *p = "hello";
    p = "hello_2";

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

4 个答案:

答案 0 :(得分:2)

你所拥有的是一个字符串常量,它存储在只读内存中。 因此,不需要使用free()

显式释放此内存

直到变量p的生命周期有效,您才能访问存储的字符串。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

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