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.