Seitenleiste

Sichtbarkeit von Variablen

Im Kapitel Definition von Variablen haben wir uns angesehen, wie man Variablen definiert. Hier werden wir uns ansehen, wo man Variablen überall definieren kann. In C Programmen gibt es da zwei Unterscheidungen, die Einfluss auf die Sichtbarkeit von Variablen nehmen. Globale Variablen sind im ganzen Quelltext zu sehen und können auch anderen Quelltexten zur Verfügung gestellt werden. Lokale Variablen sind Variablen, die nur innerhalb eines Anweisungsblocks sichtbar sind, also am Ende eines Blocks aufhören zu existieren.

Globale Variablen

Wie gesagt sind globale Variablen global sichtbar. Das bedeutet, dass sie von allen Funktionen heraus angesprichen werden können:

#include <stdlib.h>
#include <stdio.h>
 
int global = 4;
 
void func( void )
{
  global = global + 10;
  printf( "func: Wert der globalen Variable: %d\n", global );
}
 
int main( void )
{
  printf( "main: Wert der globalen Variable: %d\n", global );
  func();
  printf( "main: Wert der globalen Variable: %d\n", global );
 
  return EXIT_SUCCESS;
}

Vorteile

Werte, die in globalen Variablen stehen, müssen also nicht beim Aufruf einer Funktion übergeben werden, was den Funktionsaufruf beschleunigt und auch der Zugriff auf die Variable ist schneller.

Fehlerquellen

Dennoch sind globale Variablen heutzutage ungern gesehen: Da sie von jeder Stelle im Programm verändert werden dürfen und viele Programmierer sie für die unterschiedlichsten Dinge benutzen, zeigt die Erfahrung, dass Programme, die viel mit globalen Variablen arbeiten, häufig merkwürdige und schwer nachvollziehbare Fehler produzieren. Als Negativbeispiel wäre eine globale Variable i genannt, die in einer Schleifen hochgezählt wird. Wird innerhalb dieser Schleife nun eine Funktion gerufen, die ebenfalls das globale i als Schleifenvariable verwendet, kommen sich beide Schleifen in die Quere:

#include <stdlib.h>
#include <stdio.h>
 
/*
 * Fehlerquelle: globale Variable, die mehrfach gleichzeitig und unabhängig voneinander verwendet wird
 */
 
int i = 4;
 
void writeLine( void )
{
  /* Schreibe die Zahlen von 9 bis 1. */
 
  i = 9;
  while( i-- )
    printf( "%d", i );
}
 
int main( void )
{
  i = 5;
 
  /* Schreibe fünf Zeilen */
 
  while( i-- )
  {
    writeLine();
    printf( "\n" );
  }
 
  return EXIT_SUCCESS;
}

Es wird lediglich eine Zeile geschrieben, da writeLine() die globale Variable verändert, die auch in main() verwendet wird.

Verwendung

Globale Variablen sollten daher wirklich ausschließlich dann eingesetzt werden, wenn ihr Verwendungszweck eindeutig ist. So lässt sich die globale Konfiguration einer Software, die nur Werte enthält, die alle Teile der Software gelegentlich abfragen, vertretbar als globale Variable verwenden. Da die Konfiguration nicht mit jedem Funktionsaufruf weitergegeben werden muss, werden die Signaturen der Funktionen so übersichtlicher und der Aufruf von Funktionen schneller.

Lokale Variablen

Lokale Variablen sind nur innerhalb eines Anweisungsblock gültig. Wird das Ende des Anweisungsblocks erreicht, in dem sie definiert wurden, so geht auch die Variable verloren:

#include <stdlib.h>
#include <stdio.h>
 
void func( int parameter )
{
  parameter = paramater + 10;
  printf( "func: Wert der Variablen: %d\n", parameter );
} // hier geht parameter verloren
 
int main( void )
{
  int local = 4;
  printf( "main: Wert der lokalen Variable: %d\n", local );
  func( local );  // lokal wird als Parameter kopiert
  printf( "main: Wert der lokalen Variable: %d\n", local );
 
  return EXIT_SUCCESS;
} // hier geht local verloren

Möchte man eine lokale Variable in einer anderen Funktion verwenden, so muss man sie als Parameter übergeben.