为什么不同的字符串指针指向相同的内容在c中具有相同的加法器?

时间:2019-04-17 09:43:37

标签: c string pointers

我为字符串分配了两个具有相同内容(不是值!)的不同指针,当我打印它们的地址时,我看到它们具有相同的加法器,而无指针字符串具有不同的加法器,有人可以解释为什么会这样吗? 有人告诉我这与字符串文字有关,但我不确定。

char* str1 = "hello";
char* str2 = "hello";
char str3[8] = "hello";

printf("%p %p %p", str1, str2, str3);

输出:

0x01077B30
0x01077B30
0x0107F6E8

2 个答案:

答案 0 :(得分:3)

当您有字符串文字时,实际的字符串将存储在可能是只读的位置,因此不应修改该位置。 char*会指向该地方。因此,当您多次具有完全相同的文字时,它不需要相同字符串的多个副本,而只需使它们指向同一实际字符串即可。但是,不能保证会发生这种情况,这取决于编译器。

另一方面,当您这样做时:

char str3[8] = "hello";

您会在堆栈上获得该字符串的副本,所以这就是其地址不同的原因。

答案 1 :(得分:0)

实际上是您的编译器优化。

您的编译器决定只为一个字符串文字"hello"分配内存,并使str1str2都指向该内存。考虑到字符串文字的性质(即,不希望进行任何修改),这种用法就足够了。

但是,如果尝试打印str1str2的地址,则会发现它们是不同的。

另一方面,str3是一个数组,使用字符串文字"hello"中的内容初始化,这就是为什么将其存储在内存中的单独位置的原因。