2

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?

+5

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. –

+1

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. –

+1

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' –

Antwort

0

In Standard-C-Terminologie gibt es vier mögliche Lagerdauer:

  • Automatik (b)
  • statisch ("Hello world")
  • dynamisch (Raum durch malloc(15) zugeordnet)
  • Gewinde

Die anderen Sachen, über die Sie in Ihrer Frage fragen sind Eigenschaften bestimmter Compiler und Plattformen. Einige Setups haben keinen Stapel und keinen Heap, kein Datensegment oder .data oder .bss Abschnitt und so weiter.

Weiterführende Literatur:

1

Es hängt von Ihrer Plattform ab und es ist implementation-defined. Im Allgemeinen geht es zu dem Nur-Lese-Speicher, wenn auf Ihrem System verfügbar. Lesen Sie mehr here.

Wie Sie bemerkt haben, wenn die Funktion beendet wurde, sind die automatischen Variablen verschwunden, was zu einem Speicherverlust führt, aber nur für den Fall, dass Ihnen dynamisch Speicher zugewiesen wurde!

Das bedeutet, dass Sie func1()temp mit seinem Anrufer kommunizieren (z main()) haben zu lassen, so dass Sie später free() es. Oder wenn Sie es nicht benötigen, nachdem die Funktion ihre Aufgabe erledigt hat, dann free() es kurz vor dem Beenden der Funktion.


By the way, wie iharob sagte: Do I cast the result of malloc? NO!


Was Ihre andere Frage, die eine neue Frage sein sollte, lesen Sie this und this, sie helfen könnten.

+0

Das ist vollständig Implementierung definiert. Z.B. PC hat nicht einmal einen Nur-Lese-Speicher für normalen Code/Daten. – Olaf

+0

@Olaf ja, richtig. Ich werde meine Antwort aktualisieren. – gsamaras

Verwandte Themen