Ich versuche zu verstehen, wo Speicher in c-Programmen zugeordnet ist.Wo ist Speicher für eine unveränderliche Zeichenfolge in c reserviert?
void func1(char e, int f, int g)
{
int b = 4;
char * s = "hello world";
char * temp = (char *) malloc(15);
}
Wie ich es verstehe, gibt es drei automatische Variablen auf dem Stapel b, s und Temp zugeordnet. wo der Inhalt von b (4) auf dem Stapel gespeichert wird, und die Zeiger s und temp werden auf dem Stapel gespeichert, und die Daten für temp werden im Heap gespeichert, aber wo werden die Daten für s gespeichert? weil die b, s und temp weg sind, wenn wir den func1-Aufruf verlassen, aber der Speicher für den Inhalt wurde permanent zugewiesen. Meine andere Frage ist, dass der Stack-Pointer immer um 4 nach unten verschoben wurde, wie wenn man die Argumente der Funktionen anschaltet, selbst im Falle eines Charts, das ein Byte ist? würde der Stapel so aussehen, obwohl e nur ein Byte ist?
30:// other stuff
26: g
22: f
18: e
http://www.firmcodes.com/wp-content/uploads/2014/08/memory.png dies ist nicht das Layout für ein C-Programm?
einfach überall Ihr Werkzeug-Kette ist es setzen. Es hängt von der Architektur, dem Compiler, dem Linker, was nicht ist ab. Für GCC wird es wahrscheinlich in den '.rodata'-Abschnitt gehen, aber wo wäre es physisch .. siehe oben. –
Bitte lesen Sie, warum Sie den Rückgabewert von ['malloc()'] nicht umwandeln sollten (http://stackoverflow.com/a/605858/1983495). Und ich denke, du hast recht mit dem Stack, aber beachte auch, dass es keine Chars gibt, es gibt nur Pointer und es sind entweder 4 oder 8 für Pointer. Das * String-Literal *, das die korrekte Bezeichnung für die "Hallo Welt" -String in Ihrem Code ist, sollte im [Datensegment] (https://en.wikipedia.org/wiki/Data_segment) sein. Es würde nur gelesen werden. –
Versuchen Sie, es in eine Assembly zu kompilieren, um zu sehen, was passieren würde. ZB auf Linux/gcc/Intel CPU, verwenden: 'gcc -S -Masm = Intel Programmname.c' –