char *p = "hello";
p = "hello_2";
这里是字符串"你好"存储在内存中,其地址存在于指针“p'但是当这个指针开始指向字符串" hello_2"时,字符串" hello"会发生什么?存储?它会被释放还是这个字符串仍然存在但我们无法访问它?
答案 0 :(得分:2)
你所拥有的是一个字符串常量,它存储在只读内存中。
因此,不需要使用free()
直到变量p
的生命周期有效,您才能访问存储的字符串。
答案 1 :(得分:1)
内存不会被释放。但不会(在这种情况下)丢失。代码知道字符串的位置,并在每次运行片段时使用它,以分配给指针p。
确实需要释放堆上的内存(malloc
或strdup
的结果)。
不需要释放堆栈中的内存。
答案 2 :(得分:1)
您实际上是在创建一个名为"hello"
的字符串文字,将其分配到内存中的某个位置,并将文字的第一个字符的地址分配给指针p
,并且因为指针不是常量,可以使用不同的地址再次分配它。还有一点需要注意的是,创建的字符串文字是在只读内存中。
答案 3 :(得分:0)
全局变量,堆,代码和字符串文字都有不同的内存部分。它特定于使用的编译器。
gcc创建一个.rodata节,它是一个只读节,字符串文字存储在那里。
Visual C ++为只读部分创建.rdata部分。
您可以使用objdump(在Linux上)检查二进制文件的不同部分。