繁体   English   中英

在初始化期间为指针指定字符串值时究竟会发生什么?

[英]What exactly happens when pointers are assigned with strings values during initialization?

我很困惑,因为从我学到的东西,指针存储了他们指向的数据的地址。 但在某些代码中,我看到在初始化期间经常分配给指针的字符串。

字符串究竟发生了什么?
指针是否自动指定一个地址来存储字符串并将其自身指向该地址?
“解除引用”如何在指向字符串的指针中起作用?

的情况下

char *p = "String";

编译器为"String"分配内存,很可能"String"存储在内存的只读数据部分,并将指针p设置为指向该内存地址的第一个字节。

p --------------+
                |
                |
                V
             +------+------+------+------+------+------+------+
             |      |      |      |      |      |      |      |
             | 'S'  | 't'  | 'r'  | 'i'  | 'n'  | 'g'  | '\0' |
             |      |      |      |      |      |      |      |
             +------+------+------+------+------+------+------+
              x100    x101   x102   x103   x104   x105   x106

问:我看到在初始化期间经常分配给指针的字符串。

我认为,你所谓的字符串实际上是一个字符串文字

根据C11标准,第§6.4.5章

字符串文字是用双引号括起来的零个或多个多字节字符的序列,如"xyz" [...]

表示"xyz"产生字符串文字的第一个元素的地址,然后存储到指针中,正如您在初始化时看到的那样。

问:指针是否自动分配一个地址来存储字符串并将其自身指向该地址?

答:不可以,编译器在编译时分配用于存储字符串文字的内存。 字符串文字是存储在只读存储器还是读写存储器中是依赖于编译器的。 标准仅提到任何修改字符串文字的尝试都会导致未定义的行为

问:“解除引用”如何在指向字符串的指针中起作用?

答:就像另一个指向任何其他变量的指针一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM