请用C语言解释这种歧义

请用C语言解释这种歧义,c,random,C,Random,当我编译这个程序时,我得到一些随机数作为输出。。在Cygwin中,输出为47,但在RHEL5中,它给出了一些负随机数作为输出。 谁能告诉我原因吗? 代码: 此程序会引发未定义的行为,因为它不遵循C的规则。您应该在格式字符串后为每个格式说明符指定一个参数 在常见的C实现中,它打印指向“%d”的指针之后堆栈上发生的任何内容,并将其解释为整数。在其他情况下,它可能会发送。确实如此 关于三点: 采用可变参数数的函数缺少原型 欺骗printfprintf,告诉它你正在发送一个参数,而没有发送任何参数 无

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

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

在常见的C实现中,它打印指向
“%d”
的指针之后堆栈上发生的任何内容,并将其解释为整数。在其他情况下,它可能会发送。

确实如此

关于三点:

  • 采用可变参数数的函数缺少原型
  • 欺骗printf
    printf
    ,告诉它你正在发送一个参数,而没有发送任何参数
  • 无法从
    main
    返回值(在C99中,假定
    返回0;
    ,但您的代码肯定不是C99)

任何事情都可能发生。

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

将编译器上的警告级别一直调高。然后编译器会准确地告诉你出了什么问题。@larsmans:如果你感觉特别没有警告,那么
-Werror
。这是采访中的一个诡计问题吗?或者你是怎么想到要写这样的东西的?+1,但它是错的。打印堆栈上发生的任何内容都是鼻守护进程启动过程的一部分。可以(对于足够小的ok值)提供比格式说明符更多的参数,如
printf(“%d\n”,n,x++);/*打印n并增加x*/
。额外的参数被计算并忽略。@pmg:我说的是“应该”,而不是“必须”。我不认为编写这样的程序是可以的,除非你在IOCCC中竞争:)+1对于鼻魔,希望更多的人理解关于未定义行为的那部分第四点:问题被标记为
C
,所以OP需要
int main(void)
main()
{
printf("%d");
}