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

时间:2015-11-26 10:29:00

标签: c string pointers memory

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

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

2 个答案:

答案 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

  

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

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