请用C语言解释这种歧义
当我编译这个程序时,我得到一些随机数作为输出。。在Cygwin中,输出为47,但在RHEL5中,它给出了一些负随机数作为输出。 谁能告诉我原因吗?请用C语言解释这种歧义,c,random,C,Random,当我编译这个程序时,我得到一些随机数作为输出。。在Cygwin中,输出为47,但在RHEL5中,它给出了一些负随机数作为输出。 谁能告诉我原因吗? 代码: 此程序会引发未定义的行为,因为它不遵循C的规则。您应该在格式字符串后为每个格式说明符指定一个参数 在常见的C实现中,它打印指向“%d”的指针之后堆栈上发生的任何内容,并将其解释为整数。在其他情况下,它可能会发送。确实如此 关于三点: 采用可变参数数的函数缺少原型 欺骗printfprintf,告诉它你正在发送一个参数,而没有发送任何参数 无
代码: 此程序会引发未定义的行为,因为它不遵循C的规则。您应该在格式字符串后为每个格式说明符指定一个参数 在常见的C实现中,它打印指向
“%d”
的指针之后堆栈上发生的任何内容,并将其解释为整数。在其他情况下,它可能会发送。确实如此
关于三点:
- 采用可变参数数的函数缺少原型
- 欺骗printf
,告诉它你正在发送一个参数,而没有发送任何参数printf
- 无法从
返回值(在C99中,假定main
,但您的代码肯定不是C99)返回0;
任何事情都可能发生。printf需要第二个参数,因此它读取堆栈上该位置发生的任何事情。本质上,它是读取随机内存并将其打印出来。将编译器上的警告级别一直调高。然后编译器会准确地告诉你出了什么问题。@larsmans:如果你感觉特别没有警告,那么
-Werror
。这是采访中的一个诡计问题吗?或者你是怎么想到要写这样的东西的?+1,但它是错的。打印堆栈上发生的任何内容都是鼻守护进程启动过程的一部分。可以(对于足够小的ok值)提供比格式说明符更多的参数,如printf(“%d\n”,n,x++);/*打印n并增加x*/
。额外的参数被计算并忽略。@pmg:我说的是“应该”,而不是“必须”。我不认为编写这样的程序是可以的,除非你在IOCCC中竞争:)+1对于鼻魔,希望更多的人理解关于未定义行为的那部分第四点:问题被标记为C
,所以OP需要int main(void)
。
main()
{
printf("%d");
}