2015-05-29 4 views
0
#include<stdio.h> 

void foo(){ 
    int i; 
    printf("%d\n",i); //should print garbage value 
} 

void main(){ 
    foo(); 
} 

foo следует распечатать значение для мусора i. Но вместо этого он печатает ноль. Почему это? Я использую gcc версии 4.9.2.Почему printf не печатает значение мусора?

+6

Zero также может быть значением для мусора. – jangler

+0

debug build -> выделенная память, заполненная нулем? Проверьте его с конфигурацией выпуска. И int находится в стеке. Используйте new для создания массива int –

+0

На некоторых (воображаемых) архитектурах, компиляция вашего кода может нарисовать потолок желтого цвета ... и создать исполняемый файл, который при запуске переводит деньги на ваш банковский счет на мой , – pmg

ответ

5

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

На самом деле, это не так неожиданно. Когда ваша программа запускается, вся ее память содержит ничего, кроме нуля (это, конечно, зависит от вашей ОС, но, вероятно, это правда), поэтому, когда вы расширяете свой стек в это пространство или выделяете кучную память в первый раз, вы получите нулевые значения.

Как работает (нетривиальная) программа, она расширяет и сокращает стек, выделяет и освобождает части кучи, и постепенно память собирает много ненулевого мусора. Если вы вызвали foo() как часть реального проекта, вы можете ожидать, что значение мусора будет меняться во времени.

Конечно, в вашем тривиальном примере оптимизирующий компилятор, вероятно, заметит, что значение неинициализировано, выдает предупреждение и не загружает что-либо из памяти, и в этом случае ваше значение мусора может поступать из регистра. Шансы быть равными нулю теперь зависят от контекста, в котором вызывается foo(); если вызывающий абонент использует нуль для чего-то, вы можете указать , что вызов с этого сайта всегда будет печатать ноль.

Таким образом, неопределенное поведение не определено и может меняться в зависимости от времени выполнения программы и может варьироваться между компиляторами, между уровнями оптимизации компилятора и может измениться, когда корректируется явно связанный код.