D
static hat in C zwei Bedeutungen:
1. Einmal kann man static für globale Variablen festlegen, um den Scope (die Erreichbarkeit) in dem jeweiligen Modul (Quellcodedatei) festzulegen. Eine solche Variable besitzt dann keine Linkage mehr zu anderen Modulen (zumindest Dirk Louis nach). Für C++ benutzt man im Übrigen (oder wird zumindest empfohlen) den sog. namenlosen Namespace (im Grunde ein Namensbereich, in dem nur Sachen vorkommen, die man auch mit static hätte deklarieren können, die also nur im jeweiligen Modul vor).
2. Auch für lokale Variablen kann man die static -Speicherklasse festlegen. Dabei legt man den Scope nur für die Funktion, in der sie deklariert wurde, fest - die Anweisung, in der die Variable deklariert wurde, wird nur einmal gelesen, danach ignoriert (oder taucht im Code sogar nicht mehr vor? Weiß ich jetzt nicht genau). Allerdings wird NUR der Scope eingeschränkt, der Speicher bleibt beim Verlassen der Funktion erhalten, somit auch der Wert.
In deinem Beispiel wird ein static -Zeiger definiert, ABER NICHT INITIALISIERT, was im Grunde den Nutzen einer static -Deklaration untergräbt. Denn der Wert der Variable bleibt nicht erhalten, sondern wird immer neu zugewiesen (wenn ihr denn was zugewiesen wird). Böse wird es, wenn es sich nicht um eine relativ harmlose Variable auf dem Stack, sondern um einen Zeiger handelt:
void foo()
{
static int*pInt=malloc(sizeof(int)); //Braucht nicht, sollte sogar nicht freigegeben werden (es sei denn, das Programm wird beendet, aber dann macht's eh keinen Unterschied mehr).
static float*pFloat; //Uninitialisierter Zeiger.
pFloart=malloc(sizeof(float)); //Wenn nicht freigegeben wird, gibt es ein Speicherleck.
Man kann natürlich überprüfen, ob der Zeiger schon initialisiert wurde (soweit ich weiß, werden static -Variablen standardmässig mit 0 initialisiert, aber sicher bin ich nicht so sehr), aber das wäre eine unnötige Maßnahme, wenn man den Zeiger initialisieren würde und ihm nicht später eine Adresse zuweist (zwischen Zuweisung und Initialisierung besteht ein Unterschied). Diese würde bei einer Initialisierung erhalten bleiben.