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

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

См. Код,

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

Вывод

 0 8683508 

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

Потому что так оно и есть, согласно стандарту 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 функции, тогда как локальные переменные генерируются в стеке по мере запуска экземпляра программы.

  • Javascript: преобразование строки в число?
  • Почему разделение двух int не дает правильного значения при присвоении двойной?
  • доступ к переменной из другого classа
  • Как вы используете переменные скрипта в psql?
  • Возможно ли построить имена переменных из других переменных в bash?
  • Могу ли я использовать переменные для селекторов?
  • Как определить цвета в качестве переменных в CSS?
  • Возможно ли напечатать тип переменной в стандартном C ++?
  • if (cin >> x) - Почему вы можете использовать это условие?
  • Нужно ли назначать строку переменной перед ее сопоставлением с другим?
  • Как вы получаете имя переменной, поскольку оно было физически напечатано в его объявлении?
  • Давайте будем гением компьютера.