jak array [100] = {0} ustawia całą tablicę na 0?
Jak kompilator wypełnia wartości w char array[100] = {0};
? Co to za Magia?
Chciałem się dowiedzieć, jak wewnętrznie inicjuje się kompilator.
4 answers
To nie magia.
Zachowanie tego kodu w C jest opisane w sekcji 6.7.8.21 specyfikacji C ( online draft of C spec): 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++ ( online draft of C++ spec): kompilator agregat-inicjalizuje elementy, które nie mają określonej wartości.
Zauważ również, że w C++ (ale nie C), możesz użyć pustej listy inicjalizacyjnej, powodując, że kompilator połączy wszystkie elementy tablicy:
char array[100] = {};
Co do tego, jaki kod kompilator może wygenerować, spójrz na to pytanie: dziwne zgromadzenie z tablicy 0-inicjalizacja
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-14 23:21:25
Implementacja zależy od twórców kompilatora.
Jeśli twoje pytanie brzmi "co się stanie z taką deklaracją" - kompilator ustawi pierwszy element tablicy na wartość podaną przez ciebie (0), a wszystkie pozostałe zostaną ustawione na zero, ponieważ jest to domyślna wartość dla pominiętych elementów tablicy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-10 05:44:54
Jeśli twoim kompilatorem jest 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ż, że jest to cecha specyficzna dla kompilatora .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-02 17:32:01
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 można było pominąć program inicjujący.
Jeśli Twoja tablica jest auto, to jest to inna historia.
int foo(void)
{
char array[100] = {0};
...
}
W tym przypadku przy każdym wywołaniu funkcji foo będziesz miał ukryty memset.
Powyższy kod jest odpowiednikiem
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
I jeśli pominiesz inicjalizacja tablica będzie zawierać losowe DANE (dane stosu).
Jeśli lokalna tablica jest zadeklarowana jako statyczna, jak w
int foo(void)
{
static char array[100] = {0};
...
}
Więc technicznie jest to ten sam przypadek, co pierwszy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-09 16:15:31