【问题标题】:Please explain this ambiguity in C请在 C 中解释这种歧义
【发布时间】:2011-11-24 18:39:55
【问题描述】:

当我编译这个程序时,我得到了一些随机数作为输出。在 Cygwin 中,输出是 47,但在 RHEL5 中,它给出了一些负随机数作为输出。 谁能告诉我原因?
代码:

main()
{
printf("%d");
}

【问题讨论】:

  • 将编译器的警告级别调高。然后编译器会告诉你到底出了什么问题。
  • @larsmans: 和-Werror,如果你感觉特别没有警告的话。
  • 面试中的一个技巧问题是什么?或者你是怎么想到写这样一个东西的?

标签: c random


【解决方案1】:

这个程序会引发未定义的行为,因为它不遵循 C 的规则。您应该在格式字符串之后为每个格式说明符给 printf 一个参数。

在常见的 C 实现中,它会打印指向 "%d" 的指针之后发生在堆栈上的任何内容,并将其解释为整数。在其他人身上,它可能会发送demons flying out of your nose

【讨论】:

  • +1,但这是错误的。打印堆栈中发生的任何内容是鼻守护程序启动过程的一部分。
  • 可以(对于足够小的 ok 值)提供比格式说明符更多的参数,如 printf("%d\n", n, x++); /* print n and increase x */。额外的参数被评估和忽略。
  • @pmg:我说的是“应该”,而不是“必须”。而且我认为编写这样的程序是不行的,除非你在 IOCCC 中竞争 :)
  • +1 为鼻恶魔,希望更多人了解关于未定义行为的部分
【解决方案2】:

Undefined Behaviour

关于 3 项:

  • 采用可变数量参数的函数缺少原型
  • printf 撒谎,告诉它您正在发送 1 个参数但没有发送任何参数
  • 没有从 main 返回值(在 C99 中假定为 return 0;,但您的代码绝对不是 C99)

任何事情都有可能发生。

【讨论】:

  • 第 4 次计数:问题标记为 C,因此 OP 需要 int main(void)
【解决方案3】:

printf 需要第二个参数,因此它会读取该位置堆栈上发生的任何内容。本质上它是读取随机内存并将其打印出来。

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多