Локальный int против Global int в C - PullRequest
0 голосов
/ 21 февраля 2019

Я прочитал это:

в C, локальные переменные начинаются с неизвестного значения

, и я решил проверить это, вот что я сделал:

Три результата одной и той же программы: 1 , 2 , 3 .

Вопрос 1: Почему неизвестнозначение в 1, или почему глобальное int было 0, а локальное int было 1?

Вопрос 2: Почему локальное unsigned int с каждым новым началом было разным?

Вопрос 3: Является ли глобальный / локальный char ''?char ch = ' '; // something like that

Вопрос 4: Почему глобальные и локальные значения начинаются с разных значений (если они не инициализированы)?Для чего?

Исходный код: (я использовал clang (v10.0.0) для компиляции)

#include <stdio.h>

int global_int;
unsigned int global_unsint;
char global_char;

int main()
{
  int local_int;
  unsigned int local_unsint;
  char local_char;

  printf ("Global int: %d \t unsigned_int: %u \t char: %c\n", global_int, global_unsint, global_char);
  printf ("Local int: %d \t unsigned_int: %u \t char: %c\n", local_int, local_unsint, local_char); 
}

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Чтобы лучше понять, что происходит, вы должны знать, что в большинстве архитектур используется стек, в котором размещаются локальные автоматические переменные.При каждой вызванной функции ("invoked") используется некоторое хранилище стека, и при каждом возврате функции это хранилище снова становится доступным.

Это означает, что автоматические переменные функции используют пространство стека, которое было использованоbefore (другой функцией), и поскольку эти переменные не инициализируются компилятором или системой времени выполнения, они содержат значения из более ранних вызовов функций.Так что для вашей функции их значения undefined .

0 голосов
/ 21 февраля 2019

Доступ к неинициализированной (или ранее неназначенной) переменной вызывает Неопределенное поведение .

Может произойти все что угодно;например,

  • ваш компилятор может создать исполняемый файл
  • ваш исполняемый файл может "запускаться"
  • запуск вашего исполняемого файла может работать как ожидалось
  • напечатанные значения могут быть обоснованы как

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

0 голосов
/ 21 февраля 2019

global_int, global_unsint, global_char - глобальная переменная.Они будут расположены в сегменте bss.Ядро ОС просто сопоставит их с Copy-On-Write со страницами с нулевыми значениями для сохранения обработки подкачки на стороне ОС.Вот почему вы всегда видите, что их значения равны нулю.

local_int, unsigned int local_unsint, `local_charq - автоматическая переменная.Они будут расположены в сегменте стека основной функции.Значения их точно не знаю.Они зависят от расположения памяти в стеке, которое они были назначены во время выполнения.Поэтому мы не можем доверять инициализированным значениям для автоматической переменной.

0 голосов
/ 21 февраля 2019

локальные переменные начинаются с неизвестного значения

Не совсем верно.Локальные переменные с автоматическая продолжительность хранения do;static переменные инициализируются в ноль.Как оказалось, все локальные переменные в main() в вашем фрагменте кода имеют автоматическую продолжительность хранения.

Почему неизвестное значение равно 1, или почему global int равно 0, а local int равно 1?

Глобальные переменные имеют статическую продолжительность хранения.Это означает, что они неявно инициализируются в ноль при запуске программы.Локальные переменные с автоматическим хранением имеют неопределенные значения до тех пор, пока они не будут явно инициализированы.

Почему локальный unsigned_int при каждом новом запуске отличался?

Это неопределенное поведение для вас.Все ставки выключены.

Является ли глобальный / локальный символ ''? *

Нет.Глобальный char неявно инициализируется как '\0' при запуске программы;локальный char имеет неопределенное значение.

Почему глобальные и локальные значения начинаются с разных значений (если они не инициализированы)?Для чего?

Из-за правил инициализации объектов со статической продолжительностью хранения и автоматической продолжительностью хранения.

...