Почему пропуск аргумента в printf выводит мусор? - PullRequest
1 голос
/ 17 ноября 2011

Я использую printf через ассемблерный код. Я отмечаю, что в следующем примере, если я опускаю ожидаемый аргумент, выводится мусор.

    .386
    .model flat, c
    .stack 100h
printf PROTO arg1:Ptr Byte, printlist:VARARG
    .data
msg3fmt byte 0Ah,"%s",0Ah,"test output",0Ah,0
    .code
main proc
    INVOKE printf, ADDR msg3fmt
    ret
main endp
    end

Мой вопрос - почему? Есть ли заданный адрес памяти, который printf использует, ожидая найти аргумент? Почему что-то печатается вообще, поскольку аргумент не передается?

Ответы [ 2 ]

6 голосов
/ 17 ноября 2011

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

3 голосов
/ 17 ноября 2011

Стандарт гласит:

Если число спецификаторов формата в printf() больше количества аргументов, поведение не определено.

Неопределенное поведение означает все может произойти.

...