Як компілятор заповнює значення char array[100] = {0};
? У чому магія за цим?
Мені хотілося знати, як ініціалізується внутрішньо компілятор.
Як компілятор заповнює значення char array[100] = {0};
? У чому магія за цим?
Мені хотілося знати, як ініціалізується внутрішньо компілятор.
Відповіді:
Це не магія.
Поведінка цього коду в C описана в розділі 6.7.8.21 специфікації C ( онлайн-проект специфікації C ): для елементів, які не мають заданого значення, компілятор ініціалізує покажчики на NULL, а типи арифметики до нуля ( і рекурсивно застосовує це до агрегатів).
Поведінка цього коду в C ++ описана в розділі 8.5.1.7 специфікації C ++ ( онлайн-проект специфікацій C ++ ): агрегат компілятора ініціалізує елементи, які не мають заданого значення.
Також зауважте, що в C ++ (але не на C) ви можете використовувати порожній список ініціалізатора, змушуючи компілятор агрегувати-ініціалізувати всі елементи масиву:
char array[100] = {};
Що стосується того, який код може створювати компілятор, роблячи це, погляньте на це питання: Дивна збірка з масиву 0-ініціалізація
Реалізація залежить від розробників-компіляторів.
Якщо у вас запитання "що буде з такою декларацією", компілятор встановить для першого елемента масиву значення, яке ви вказали (0), а всі інші встановлять на нуль, оскільки це значення за замовчуванням для опущених елементів масиву.
Якщо ваш компілятор GCC, ви також можете використовувати наступний синтаксис:
int array[256] = {[0 ... 255] = 0};
Погляньте на сторінку http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designized-Inits.html#Designized-Inits і зверніть увагу, що це особливість компілятора .
Це залежить від того, куди ви поставите цю ініціалізацію.
Якщо масив статичний як в
char array[100] = {0};
int main(void)
{
...
}
то саме компілятор резервує 100 0 байт у сегменті даних програми. У цьому випадку ви могли пропустити ініціалізатор.
Якщо ваш масив автоматично, то це вже інша історія.
int foo(void)
{
char array[100] = {0};
...
}
У цьому випадку під час кожного виклику функції foo у вас з'явиться прихована пам’ятка.
Код, наведений вище, еквівалентний
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
і якщо ви опустите ініціалізатор, ваш масив буде містити випадкові дані (дані стека).
Якщо ваш локальний масив оголошений статичним, як в
int foo(void)
{
static char array[100] = {0};
...
}
тоді це технічно той самий випадок, що і перший.