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.

Author: Bakuriu, 2009-03-10

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

 157
Author: bk1e,
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.

 33
Author: qrdl,
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 .

 27
Author: lakshmanaraj,
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.

 17
Author: LPs,
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