Die Computerseite von Eckart Winkler
Die Rolle des Stacks in C - Teil 2

 

Sie wissen aus dem ersten Teil, daß in C bei der Übergabe von Parametern an Funktionen generell eine Wertübergabe stattfindet. Trotzdem muß es doch irgendwie möglich sein, eine Funktion set7 zu schreiben, die tatsächlich den Wert der übergebenen Variablen ändert. In anderen Programmiersprachen geht das doch auch!


Parameterübergabe als Referenz

Natürlich geht das in anderen Programmiersprachen, und natürlich geht das auch in C. Allerdings etwas anders. Man muß eben die Adresse der Variablen übergeben. Und damit gibt man der Funktion die Möglichkeit, auf die Stelle im Speicher zuzugreifen, an der der Wert der Variablen gespeichert ist. Somit kann man auch den Wert ändern.

Sehen Sie sich einmal das folgende Programm an:

#include <stdio.h>
void set7(short *x);

void main()
{
  short x=5;
  set7(&x);
  printf("x=%d\n",x);
}

void set7(short *y)
{
  *y=7;
}

Es ist gegenüber dem Programm aus Teil 1 nur geringfügig geändert. Und zwar wird die Funktion set7 nicht mit einem Parameter short y, sondern short *y definiert. y enthält die Adresse der übergebenen Variablen. Soll auf den Wert der Variablen zugegriffen werden, muß der Operator * zur Anwendung kommen.

Geändert werden muß dann natürlich der Prototyp der Funktion. Und schließlich der Aufruf. Hier wird die Adresse einer short-Variablen erwartet. Zur Ermittlung der Adresse dient der Adreß-Operator &.


Textkonstanten

Nun sollten Sie sich auch den anderen Funktionsaufruf in diesem Programm ansehen, nämlich den von printf. Im ersten Teil hatten wir ja schon überlegt, daß als erstes die Adresse des Formatstrings auf den Stack gelegt werden muß. Die Frage aber: Wo befindet sich denn der Formatstring überhaupt? Irgendwo im Speicher muß er doch abgelegt sein. Wird dieser auch auf dem Stack angelegt?

Nein, für diesen Zweck gibt es in einem Programm ein Textsegment, das zur Aufnahme von Stringkonstanten gedacht ist. Ein solches Textsegment wird vom Compiler in das fertige Programm eingefügt, und beim Start des Programms wird es in den Hauptspeicher geladen. Adressen von Textkonstanten verweisen daher immer auf dieses im Speicher geladene Textsegment.


Globale Variablen

Eine andere Frage betrifft die globalen Variablen. Sie wissen, daß ein C-Programm im Grunde nur aus Funktionen besteht und alle in diesen definierten Variablen lokale Variablen sind, die auf dem Stack angelegt werden. Allerdings gibt es auch globale Variablen, die keiner Funktion zugeordnet sind und daher in allen Funktionen gültig sind. Werden denn diese auf dem Stack angelegt?

Nein, auch das nicht. Auch für globale Variablen gibt es ein eigenes Segment. Dieses muß aber nicht in der Programmdatei vorhanden sein, da die Inhalte erst zur Laufzeit belegt werden. Adressen von globalen Variablen verweisen also immer auf dieses Segment im Hauptspeicher.


Zusammenfassung

  • Ein Stack (Stapelspeicher) ist eine Datenstruktur, bei der der Zugriff nur auf das oberste Element möglich ist.
  • Zur Übergabe von Parametern an Funktionen wird ein für das Programm globaler Stack benutzt.
  • Prinzipiell findet in C eine Wertübergabe an Funktionen statt.
  • Zur Übergabe von Referenzen muß die Adresse der betreffenden Variablen übergeben werden.
  • Auch lokale Variablen erhalten Speicherplatz auf diesem Stack.
  • Textkonstanten werden nicht auf dem Stack angelegt, für diese gibt es ein eigenes Textsegment.
  • Globale Variablen werden auch nicht auf dem Stack angelegt, auch für diese gibt es ein eigenes Speichersegment.

 

Übersicht Programmiersprache C Index