【问题标题】:Why does omitting an argument to printf print garbage?为什么省略 printf 打印垃圾的参数?
【发布时间】:2011-11-17 08:43:30
【问题描述】:

我正在通过汇编代码使用 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 使用期望找到一个参数?既然没有传递任何参数,为什么还要打印任何东西?

【问题讨论】:

    标签: c assembly x86 printf


    【解决方案1】:

    原因是格式说明符告诉 printf 它应该接收多少个参数。 printf 从堆栈中获取它的数据;如果您不为其提供任何数据,那么它将拉出堆栈中发生的任何内容并将其视为参数。

    【讨论】:

      【解决方案2】:

      标准说

      如果printf() 中格式说明符的数量大于参数的数量,则行为未定义。

      未定义行为意味着任何事情都可能发生。

      【讨论】:

      • 我问的是为什么会发生这种情况,而不是一般的回答,即行为未定义。
      • @Sonny 这就是未定义行为的问题。 “为什么”是未定义的。它是......未定义的行为。您看到的行为可能有可能导致“在堆栈上找不到参数”,但在 ARM 上,前几个 varargs 参数在寄存器中,所以答案是错误的。您可以为可变参数和 C 调用约定构想出各种有效的方案。所以唯一清楚、简洁的说法是它调用了未定义的行为。
      • @James 但我在问为什么发生了什么。说许多情况是可能的和解释特定情况的原因是有区别的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2016-04-15
      • 1970-01-01
      • 2023-03-25
      • 2023-03-28
      相关资源
      最近更新 更多