Подтвердить что ты не робот

Почему глобальные переменные всегда инициализируются на "0", но не локальные переменные?

Возможный дубликат:
Почему глобальные и статические переменные инициализируются значениями по умолчанию?

См. код,

#include <stdio.h>

int a;
int main(void)
{
    int i;
    printf("%d %d\n", a, i);
}

Выход

0 8683508

Здесь "a" инициализируется "0", но "i" инициализируется "значением нежелательной почты". Почему?

4b9b3361

Ответ 1

Потому что так оно и есть, в соответствии со стандартом C. Причиной этого является эффективность:

  • статические переменные инициализируются во время компиляции, так как их адрес известен и фиксирован. Инициализация их до 0 не требует затрат времени исполнения.

  • автоматические переменные могут иметь разные адреса для разных вызовов и должны быть инициализированы во время выполнения при каждом вызове функции, в результате чего могут потребоваться затраты времени исполнения. Если вам нужна эта инициализация, запросите ее.

Ответ 2

global и static переменные сохраняются в сегменте данных (DS) при инициализации и блокируют запуск по символу (BSS) `при неинициализации.

Эти переменные имеют фиксированную ячейку памяти, а память выделяется во время компиляции.

Таким образом, переменные global и static имеют '0' в качестве значений по умолчанию.

В то время как переменные auto хранятся в стеке, и они не имеют фиксированной ячейки памяти.

Память распределяется по переменным auto во время выполнения, но не при время компиляции. Следовательно, переменные auto имеют значение по умолчанию как мусор.

Ответ 3

Вы выбрали простые переменные, но учтите:

void matrix_manipulation(void)
{
    int matrix1[100][100];
    int matrix2[100][100];
    int matrix3[100][100];

    /* code to read values for matrix1 from a file */
    /* code to read values for matrix2 from a file */
    /* code to multiply matrix1 by matrix2 storing the result in matrix3 */
    /* code to use matrix3 somehow */
}

Если система инициализировала массивы до 0, усилия будут потрачены впустую; инициализация перезаписывается остальной частью функции. C избегает скрытых затрат, когда это возможно.

Ответ 4

Глобальные переменные выделяются и инициализируются до запуска функции main, а локальные переменные генерируются в стеке по мере запуска экземпляра программы.