Lokale Variablen können jederzeit und fast überall in einer Funktion definiert werden. Sie werden zum Zeitpunkt ihrer Definition erzeugt und bei Verlassen der Funktion gelöscht.

#include <stdio.h>

int main()
{
	int a = 5;
	int b = 11;
	int c = a + b;
	printf("%d", c);
	return 0;
}


Wird eine lokale Variable als Parameter an eine Funktion übergeben, so wird die Variable kopiert. Die Kopie wird dann als lokale Variable in der aufgerufenen Funktion verwendet. Dies sorgt dafür, dass Änderungen an Variablen in Funktionen außerhalb der Funktion nicht sichtbar sind.

Variablennamen müssen nur innerhalb ihrer Funktion eindeutig sein. Gleiche Namen in unterschiedlichen Funktionen sind okay.

Versuche einmal, die Lebenszeit der Variablen im folgenden Beispiel zu bestimmen:

#include <stdio.h>

int bar(int k)
{
	int p = k * 3;
	int q = k / 2;
	return p + q;
}

int foo(int x)
{
	int y = x * 2;
	int z = bar(y);
	return z;
}

int main()
{
	int a = 5;
	int b = foo(a);
	printf("%d", b);
	return 0;
}

Die Variablen werden in folgender Reihenfolge angelegt und gelöscht:

  • a wird angelegt und auf 5 initialisiert
  • Speicher für b wird angelegt
  • a wird kopiert und als lokale Variable x in foo verwendet
  • y wird angelegt und mit x (a) mal 2 initialisiert
  • Speicher für z wird angelegt
  • y wird kopbiert und als lokale Variable k in bar verwendet
  • p wird angelegt und mit k ( y ) mal 3 initialisiert
  • q wird angelegt und mit k durch 2 initialisiert
  • p und q wird summiert, das Ergebnis zurückgegeben und in z gespeichert.
  • Die Funktion "bar" wurde verlassen: k, p und q werden gelöscht
  • z wird zurückgegeben und in b gespeichert
  • Die Funktion "foo" wird verlassen: x, y und z werden gelöscht
  • b wird auf der Konsole ausgegeben
  • Funktion "main" wird verlassen: a und b werden gelöscht


Da am eine einer Funktion alle Variablen der Funktion gelöscht werden, ist es gefährlich einen Pointer auf eine lokale Variable als Funktionsergebnis zurückzugeben. Ein solcher Pointer zeigt nach Ende der Funktion auf einen nicht mehr verwendeten Speicherbereich. Wird dieser Speicherbereich verwendet stürzt das Programm mit einer Speicherverletzung ab. Beispiel:

#include <stdio.h>

int *foo()
{
	int x = 5;
	return &x;
}

int main()
{
	int *p = foo();

	printf("%p\n", p);

	//printf("%d\n", *p);

	return 0;
}



Zuletzt geändert: Freitag, 18. Mai 2018, 16:43