我为字符串分配了两个具有相同内容(不是值!)的不同指针,当我打印它们的地址时,我看到它们具有相同的加法器,而无指针字符串具有不同的加法器,有人可以解释为什么会这样吗? 有人告诉我这与字符串文字有关,但我不确定。
char* str1 = "hello";
char* str2 = "hello";
char str3[8] = "hello";
printf("%p %p %p", str1, str2, str3);
0x01077B30
0x01077B30
0x0107F6E8
答案 0 :(得分:3)
当您有字符串文字时,实际的字符串将存储在可能是只读的位置,因此不应修改该位置。 char*
会指向该地方。因此,当您多次具有完全相同的文字时,它不需要相同字符串的多个副本,而只需使它们指向同一实际字符串即可。但是,不能保证会发生这种情况,这取决于编译器。
另一方面,当您这样做时:
char str3[8] = "hello";
您会在堆栈上获得该字符串的副本,所以这就是其地址不同的原因。
答案 1 :(得分:0)
实际上是您的编译器优化。
您的编译器决定只为一个字符串文字"hello"
分配内存,并使str1
和str2
都指向该内存。考虑到字符串文字的性质(即,不希望进行任何修改),这种用法就足够了。
但是,如果尝试打印str1
和str2
的地址,则会发现它们是不同的。
另一方面,str3
是一个数组,使用字符串文字"hello"
中的内容初始化,这就是为什么将其存储在内存中的单独位置的原因。