Почему глобальные переменные всегда инициализируются на «0», но не локальные переменные?
Возможный дубликат:
Почему глобальные и статические переменные инициализируются значениями по умолчанию?
См. Код,
#include int a; int main(void) { int i; printf("%d %d\n", a, i); }
Вывод
- Почему локальные переменные, включая примитивы, всегда инициализируются в Java?
- Как установить переменные в сценариях HIVE
- В чем разница между int и long на C ++?
- Неинициализированные переменные и члены в Java
- Лучше ли в C ++ проходить по значению или передавать постоянную ссылку?
0 8683508
Здесь «a» инициализируется «0», но «i» инициализируется «значением нежелательной почты». Зачем?
- Что такое ссылочная переменная в C ++?
- Угловой - общий сервис между компонентами не работает
- Установка переменных среды в Rails 3 (Devise + Omniauth)
- Значение переменной доступа с использованием строки, представляющей имя переменной в C ++
- Использование переменных внутри bash heredoc
- Как сохранить стандартную ошибку в переменной в сценарии Bash
- Объявление переменных внутри оператора switch
- Как разместить рекламу в lesscss
Потому что так оно и есть, согласно стандарту C. Причиной этого является эффективность:
-
статические переменные инициализируются во время компиляции , так как их адрес известен и фиксирован. Инициализация их до
0
не требует затрат времени исполнения. -
автоматические переменные могут иметь разные адреса для разных вызовов и должны быть инициализированы во время выполнения при каждом вызове функции, в результате чего может потребоваться время выполнения. Если вам нужна эта инициализация, запросите ее.
global
и static
переменные сохраняются в сегменте данных (DS) при инициализации и блокируют запуск по символу (BSS) `при неинициализации.
Эти переменные имеют фиксированное расположение памяти, а память выделяется во время компиляции.
Таким образом, global
и static
переменные имеют значения '0'
качестве значений по умолчанию.
В то время как auto
переменные хранятся в стеке, и у них нет фиксированной ячейки памяти.
Память выделяется для auto
переменных во время выполнения, но не во время компиляции. Следовательно, auto
переменные имеют значение по умолчанию как мусор.
Вы выбрали простые переменные, но учтите:
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 позволяет избежать скрытых затрат, когда это возможно.
Глобальные переменные распределяются и инициализируются до начала main
функции, тогда как локальные переменные генерируются в стеке по мере запуска экземпляра программы.