webentwicklung-frage-antwort-db.com.de

Warum werden globale Variablen immer mit '0' initialisiert, nicht jedoch lokale Variablen?

Mögliches Duplikat:
Warum werden globale und statische Variablen auf ihre Standardwerte initialisiert?

Siehe den Code,

#include <stdio.h>

int a;
int main(void)
{
    int i;
    printf("%d %d\n", a, i);
}

Ausgabe

0 8683508

Hier wird 'a' mit '0' initialisiert, aber 'i' wird mit einem 'Junk-Wert' initialisiert. Warum?

51
yuvanesh

Denn so ist es nach dem C-Standard. Der Grund dafür ist Effizienz:

  • statisch Variablen werden zur Kompilierzeit initialisiert, da ihre Adresse bekannt und fest ist. Initialisierung auf 0 verursacht keine Laufzeitkosten.

  • automatisch Variablen können unterschiedliche Adressen für unterschiedliche Aufrufe haben und müssten bei jedem Funktionsaufruf um Laufzeit initialisiert werden. Dies verursacht möglicherweise Laufzeitkosten, die nicht benötigt werden. Wenn Sie diese Initialisierung benötigen, fordern Sie sie an.

109
K-ballo

Die Variablen global und static werden bei der Initialisierung im Datensegment (DS) und bei der Nichtinitialisierung im Blockstart nach Symbol (BSS) `gespeichert.

Diese Variablen haben einen festen Speicherort und der Speicher wird zur Kompilierungszeit zugewiesen.

So haben global und static Variablen '0' als Standardwerte.

Während auto Variablen auf dem Stack gespeichert sind, haben sie keinen festen Speicherort.

Speicher wird zur Laufzeit auto Variablen zugewiesen, jedoch nicht zur Kompilierungszeit. Daher haben auto Variablen ihren Standardwert als Müll.

41

Sie haben einfache Variablen ausgewählt, berücksichtigen jedoch Folgendes:

void matrix_manipulation(void)
{
    int matrix1[100][100];
    int matrix2[100][100];
    int matrix3[100][100];

    /* code to read values for matrix1 from a file */
    /* code to read values for matrix2 from a file */
    /* code to multiply matrix1 by matrix2 storing the result in matrix3 */
    /* code to use matrix3 somehow */
}

Wenn das System die Arrays auf 0 initialisiert, wird der Aufwand verschwendet. Die Initialisierung wird durch den Rest der Funktion überschrieben. C vermeidet versteckte Kosten, wann immer dies möglich ist.

15

Globale Variablen werden zugewiesen und initialisiert, bevor die Funktion main gestartet wird, während lokale Variablen auf dem Stapel generiert werden, während die Instanz des Programms ausgeführt wird.

7
WiSaGaN