我很困惑,因为从我学到的东西,指针存储了他们指向的数据的地址。但在某些代码中,我看到在初始化期间经常分配给指针的字符串。
字符串究竟发生了什么?
指针是否自动指定一个地址来存储字符串并将其自身指向该地址?
“解除引用”如何在指向字符串的指针中起作用?
答案 0 :(得分:8)
如果是
char *p = "String";
编译器为"String"
分配内存,很可能"String"
存储在内存的read only data部分,并将指针p
设置为指向该内存地址的第一个字节。
p --------------+
|
|
V
+------+------+------+------+------+------+------+
| | | | | | | |
| 'S' | 't' | 'r' | 'i' | 'n' | 'g' | '\0' |
| | | | | | | |
+------+------+------+------+------+------+------+
x100 x101 x102 x103 x104 x105 x106
答案 1 :(得分:4)
问:我看到在初始化期间经常分配给指针的字符串。
我认为,你所谓的 string 实际上是一个字符串文字。
根据C11
标准,章节§6.4.5
字符串文字是包含在其中的零个或多个多字节字符的序列 双引号,如
"xyz"
中所示。 [...]
表示,"xyz"
生成字符串文字的第一个元素的地址,然后存储到指针中,正如您在初始化时看到的那样。
问:指针是否会自动指定一个地址来存储字符串并将其自身指向该地址?
答:不,存储字符串文字的内存是在编译时由编译器分配的。字符串文字是存储在只读存储器还是读写存储器中是依赖于编译器的。标准仅提及任何修改字符串文字的尝试都会产生undefined behavior。
问:“解除引用”如何在指向字符串的指针中起作用?
答:就像另一个指向任何其他变量的指针一样。