我正在尝试使用代码。
#include <stdio.h>
int main() {
char *s2 = "Test";
char *s3 = "Test";
printf("\n%u",s2);
printf("\n%u",s3);
return 0;
}
当我执行此代码时,我得到了以下输出。
4196492
4196492
为什么输出如此。?它为s2和s3打印相同的地址
答案 0 :(得分:4)
在大多数编译器中,当字符串值直接分配给指针时,它存储在只读块中(通常在数据段中)。
这是在功能之间共享的。
当你说char *str = "Test";
“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
的地址不同。
答案 1 :(得分:0)
因为String
自动存储为内存中的引用类型,所以它被视为地址本身。如果将“TEST”存储为另一个指针,则该指针将指向先前存储“TEST”的同一地址。