Как это возможно, если программа всегда присваивает переменной свободное место в памяти? Как это могло быть что-то, а не ноль?
Давайте посмотрим на пример практической реализации.
Скажем, он использует стек для хранения локальных переменных.
void
foo(void)
{
int foo_var = 42;
}
void
bar(void)
{
int bar_var;
printf("%d\n", bar_var);
}
int
main(void)
{
bar();
foo();
bar();
}
Полностью сломанный код выше иллюстрирует эту мысль. После того, как мы вызываем foo, определенному месту в стеке, куда был помещен foo_var, устанавливается значение 42. Когда мы вызываем bar, bar_var занимает именно это место. И действительно, выполнение кода приводит к печати 0 и 42, показывая, что на значение bar_var нельзя полагаться, если оно не инициализировано.
Теперь должно быть ясно, что требуется инициализация локальной переменной. Но может ли main быть исключением? Есть ли что-нибудь, что могло бы сыграть со стеком и в результате дать нам ненулевое значение?
да. main - это не первая функция, выполняемая в вашей программе. На самом деле требуется тонны работы, чтобы все настроить. Любая из этих работ могла бы использовать стек и оставить в нем ненулевые числа. Мало того, что вы не можете ожидать одинакового значения в разных операционных системах, оно вполне может внезапно измениться в той самой системе, которую вы используете сейчас. Заинтересованные стороны могут поискать в Google "динамический компоновщик".
Наконец, в стандарте языка C нет даже термина «стек». «Место» для локальных переменных остается за компилятором. Он мог даже получить случайную чушь из того, что попало в данный регистр. Это действительно может быть полностью что угодно. Фактически, если запускается неопределенное поведение, компилятор может делать все, что ему хочется.
person
employee of the month
schedule
11.05.2015
cout
от C ++. - person Shafik Yaghmour   schedule 11.05.2015cout
на C? - person Deanie   schedule 11.05.2015