当我在我的Linux x86_64机器上使用GCC编译和运行以下C程序时:
我总是得到以下输出:
两个指针不相等,因为它们是两个可以独立操作的数组。
我想知道GCC如何生成这两个程序的代码,并在执行期间将它们映射到内存。由于这已经被记录了很多次,因此欢迎提供文档链接。
#include <stdio.h>
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);
}
}
我总是得到以下输出:
我知道字符串存储在常量表中,但与动态分配的内存相比,地址太低了。与以下程序进行比较:equal 0x40064c 0x40064c
#include <stdio.h>
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如何生成这两个程序的代码,并在执行期间将它们映射到内存。由于这已经被记录了很多次,因此欢迎提供文档链接。
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 将局部 const 数组视为变量,而不是真正的只读常量,因此需要使用static
。它也不会合并字符串,所以这两个字符串有不同的指针。你正在使用哪个编译器? - Nominal Animal