Wo werden von GCC Zeichenfolgenkonstanten gespeichert und von wo aus werden diese Zeiger zugeordnet?

Beim Kompilieren und Ausführen des folgenden C-Programms auf meinem von GCC kompilierten Linux x86_64-Computer:

#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);
    }
}

Ich erhalte die Ausgabe immer als:

gleich 0x40064c 0x40064c

Ich verstehe, dass Zeichenfolgen in einer konstanten Tabelle gespeichert sind, die Adresse jedoch im Vergleich zum dynamisch zugewiesenen Speicher zu niedrig ist.

Vergleichen Sie mit folgendem Programm:

#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
    }
}

Die beiden Zeiger sind nicht gleich, da es sich um zwei Arrays handelt, die unabhängig voneinander bearbeitet werden können.

Ich möchte wissen, wie GCC den Code für diese beiden Programme generiert und wie sie während der Ausführung dem Speicher zugeordnet werden. Da dies bereits dokumentiert wäre, sind auch häufig Links zur Dokumentation willkommen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage