W jaki sposób kompilator wypełnia wartości char array[100] = {0};
? Jaka magia się za tym kryje?
Chciałem wiedzieć, jak inicjuje się wewnętrznie kompilator.
c++
c
compiler-construction
Namratha Patil
źródło
źródło
Odpowiedzi:
To nie jest magia.
Zachowanie tego kodu w C jest opisane w sekcji 6.7.8.21 specyfikacji C ( wersja robocza specyfikacji C online ): dla elementów, które nie mają określonej wartości, kompilator inicjalizuje wskaźniki na NULL i typy arytmetyczne na zero ( i rekurencyjnie stosuje to do agregatów).
Zachowanie tego kodu w C ++ jest opisane w sekcji 8.5.1.7 specyfikacji C ++ ( wersja robocza specyfikacji C ++ w trybie online ): kompilator agreguje-inicjuje elementy, które nie mają określonej wartości.
Zwróć też uwagę, że w C ++ (ale nie w C) możesz użyć pustej listy inicjalizującej, co spowoduje, że kompilator będzie agregował i inicjował wszystkie elementy tablicy:
Jeśli chodzi o rodzaj kodu, który kompilator może wygenerować, gdy to zrobisz, spójrz na to pytanie: Dziwny zestaw z tablicy 0-inicjalizacja
źródło
Implementacja należy do programistów kompilatorów.
Jeśli twoje pytanie brzmi "co się stanie z taką deklaracją" - kompilator ustawi pierwszy element tablicy na wartość, którą podałeś (0), a wszystkie pozostałe na zero, ponieważ jest to wartość domyślna dla pominiętych elementów tablicy.
źródło
Jeśli Twój kompilator to GCC, możesz również użyć następującej składni:
Proszę spojrzeć na http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits i zauważyć, że jest to funkcja specyficzna dla kompilatora .
źródło
To zależy, gdzie umieścisz tę inicjalizację.
Jeśli tablica jest statyczna, jak w
wtedy to kompilator rezerwuje 100 0 bajtów w segmencie danych programu. W takim przypadku mogłeś pominąć inicjalizator.
Jeśli twoja tablica jest automatyczna, to inna historia.
W takim przypadku przy każdym wywołaniu funkcji foo będziesz mieć ukryty zestaw pamięci.
Powyższy kod jest równoważny z
a jeśli pominiesz inicjalizator, twoja tablica będzie zawierała losowe dane (dane stosu).
Jeśli twoja lokalna tablica jest zadeklarowana jako statyczna, jak w
to jest technicznie ten sam przypadek, co pierwszy.
źródło