Я предполагаю, что вы собираете
main(){ printf("%d");}
Это будет выбрать случайное значение из текущего стека. Попробуйте это:
main() {
printf("%d", 0);
printf("%d");
}
Теперь второй printf()
всегда будет печатать 0
, так как он получает тот же стек в качестве первого вызова.
[EDIT] Это не работает на x86 Linux с GCC 4.1.2. Вот сгенерированный код на ассемблере (использование gcc -S -o t.s t.c
):
movl $0, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $.LC0, %edi
movl $0, %eax
call printf
Как вы можете видеть, второй аргумент не помещается в стек, но прошел через %esi
(который является регистром). Этот же регистр, вероятно, изменен в printf()
, поэтому он теряет свою ценность. Damn optimizations;)
Какое заявление? –
RTFM. [Требуется xtra chars] – spender