Где хранятся строковые константы в GCC и откуда отображаются эти указатели?

Когда я компилирую и запускаю следующую программу C на моем компьютере с Linux x86_64, скомпилированную 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 генерирует код для этих двух программ и как они отображаются в память во время выполнения. Поскольку это уже задокументировано, делайте так много раз, и любые ссылки на документацию приветствуются.

Ответы на вопрос(1)

Ваш ответ на вопрос