当我编译和我的Linux x86_64的机器,由GCC编译于下面的C程序运行:GCC存储的字符串常量以及这些指针映射的位置在哪里?
#include
int main(void)
{
char *p1 = "hello"; // Pointers to strings
char *p2 = "hello"; // Pointers to strings
if (p1 == p2) { // They are equal
printf("equal %p %p\n", p1, p2); // equal 0x40064c 0x40064c
// This is always the output on my machine
}
else {
printf("NotEqual %p %p\n", p1, p2);
}
}
我总是得到输出:
等于0x40064c 0x40064c
我理解字符串存储在一个常量表中,但与动态分配的内存相比,地址太低。
比较用下面的程序:
#include
int main(void)
{
char p1[] = "hello"; // char arrar
char p2[] = "hello"; // char array
if (p1 == p2) {
printf("equal %p %p\n", p1, p2);
}
else { // Never equal
printf("NotEqual %p %p\n", p1, p2); // NotEqual 0x7fff4b25f720 0x7fff4b25f710
// Different pointers every time
// Pointer values too large
}
}
两个指针不相等,因为这些是可以独立操纵两个阵列。
我想知道GCC如何生成这两个程序的代码,以及它们在执行过程中如何映射到内存。由于这已经记录了很多次,所以文档的任何链接都是受欢迎的。
2012-09-12
Xolve
+0
你总是可以在拆卸时达到最高点。这是一种很好的开发技巧,你需要在未来再做一次。 –
+0
您的示例代码中只有两个字符串:'equal%p%p \ n'和'NotEqual%p%p \ n'。 'p1'和'p2'只是字符数组变量,初始化为某个值,然后用作字符串。特别是,你仍然可以做'p1 [0] ='H'; p2 [0] ='J';'例如,没有任何问题。如果你希望'p1'和'p2'是字符串常量,可以使用'static const char p1 [] =“Hello”;'。至少GCC-4.6.3将局部常量数组视为变量,而不是真正的只读常量,因此需要“静态”。它不会合并字符串,所以它们有不同的指针。你正在使用哪种编译器? –