在大多数编译器中,当将字符串值直接分配给指针时,它会存储在只读块中(通常在数据段中)。
这是在功能之间共享的。
当你说char *str = "Test";
“测试”存储在共享只读位置,但指针str
存储在读写内存中,并str
指向只读位置中的该内存位置。当您将相同的字符串分配给不同的指针时,例如char* str2 = "Test";
. 指针将str2
指向与只读存储器位置相同的地址,这就是输出相同的原因。
以下代码将失败;程序将崩溃,因为您试图更改只读字符串:
int main() {
char *str;
str = "Test"; // Stored in read only part of data segment
*(str+1) = 'n'; // Trying to modify read only memory. segfault
getchar();
return 0;
}
使用char
数组创建字符串不同于使用char
指针创建字符串;该char
数组将像 C 中的其他类型的数组一样创建。
例如,如果str[]
是自动变量,则字符串存储在堆栈段中。如果str[]
是全局或静态变量,则存储在数据段中。
int main() {
char str[] = "Test"; // Stored in stack segment like other auto variables
*(str+1) = 'n'; //This is fine
getchar();
return 0;
}
以下代码澄清了一些事情:
#include <stdio.h>
char s1[] = "Test"; //Global in data segment
int main() {
char *s2 = "Test"; //Read only
char *s3 = "Test"; //pointed to a string in a Read only memory
char s4[] = "Test"; //stack segment
char s5[] = "Test"; //another array in stack segment
printf("\n%p",s1);
printf("\n%p",s2);
printf("\n%p",s3);
printf("\n%p",s4);
printf("\n%p",s5);
return 0;
}
这将打印这样的东西。
6294408
4196492
4196492
1092092672
1092092656
所以你可以看到和的地址s1
是不同的。s4
s5