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.
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.
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:
char array[100] = {};
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
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.
Jeśli Twój kompilator to GCC, możesz również użyć następującej składni:
int array[256] = {[0 ... 255] = 0};
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 .
To zależy, gdzie umieścisz tę inicjalizację.
Jeśli tablica jest statyczna, jak w
char array[100] = {0};
int main(void)
{
...
}
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.
int foo(void)
{
char array[100] = {0};
...
}
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
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
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
int foo(void)
{
static char array[100] = {0};
...
}
to jest technicznie ten sam przypadek, co pierwszy.