Почему глобальные переменные всегда инициализируются на "0", но не локальные переменные?
Возможный дубликат:
Почему глобальные и статические переменные инициализируются значениями по умолчанию?
См. код,
#include <stdio.h>
int a;
int main(void)
{
int i;
printf("%d %d\n", a, i);
}
Выход
0 8683508
Здесь "a" инициализируется "0", но "i" инициализируется "значением нежелательной почты". Почему?
Ответы
Ответ 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
, а локальные переменные генерируются в стеке по мере запуска экземпляра программы.