我很困惑,因为从我所了解到的,指针存储他们指向的数据的地址。但是在一些代码中,我会看到在初始化过程中经常分配给指针的字符串。在初始化过程中指针被分配了字符串值时究竟发生了什么?
字符串究竟发生了什么?
指针是否自动分配一个地址来存储字符串并将自己指向该地址?
“取消引用”如何在指向字符串的指针中起作用?
我很困惑,因为从我所了解到的,指针存储他们指向的数据的地址。但是在一些代码中,我会看到在初始化过程中经常分配给指针的字符串。在初始化过程中指针被分配了字符串值时究竟发生了什么?
字符串究竟发生了什么?
指针是否自动分配一个地址来存储字符串并将自己指向该地址?
“取消引用”如何在指向字符串的指针中起作用?
问:我经常看到初始化过程中分配给指针字符串。
我想,你在呼唤什么作为串实际上是一个字符串文字。
根据C11
标准,章§6.4.5
字符串文字是封闭在 双引号零个或多个多字节字符的序列,如在
"xyz"
。 [...]
的表示,"xyz"
产生字符串文字的第一元件,然后将其存储到指针,因为你已经在初始化的时候看到的地址。
问:指针是否自动分配一个地址来存储字符串并将自己指向该地址?
答:不,编译器在编译时分配存储字符串文字的内存。字符串文字是存储在只读存储器还是读写存储器中,都依赖于编译器。标准仅提到任何修改字符串文字的尝试都会导致undefined behavior。
问:“取消引用”如何在指向字符串的指针中工作?
答:就像在另一个指向任何其他变量的指针的情况下一样。
在
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
我想你也应该更新答案,在这种情况下如何存储一个'\ 0'来标记字符串的结尾以及所有函数在内部如何使用它来打印和使用字符串。 –
@Krishna_Oza这有什么相关的?问题是关于字符串文字的分配和指向它们的指针。 – Lundin
先生,'字符串存储在只读数据部分'.....标准中指定的任何东西? –