Linux x86_64マシンで、GCCによってコンパイルされた次のCプログラムをコンパイルして実行すると、次のようになります。
#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);
}
}
私は常に次のように出力を取得します:
等しい0x40064c0x40064c
文字列は定数テーブルに格納されていることは理解していますが、動的に割り当てられたメモリと比較すると、アドレスが低すぎます。
次のプログラムと比較してください。
#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
}
}
これらは独立して操作できる2つの配列であるため、2つのポインターは等しくありません。
GCCがこれら2つのプログラムのコードを生成する方法と、実行中にそれらがメモリにどのようにマップされるかを知りたいです。これはすでに文書化されているので、何度も文書化することを歓迎します。