我用C语言编写了这个小代码:
#include <stdio.h>
int alo();
int main()
{
printf ("%d",alo());
}
int alo(int i, int x)
{
return (x);
}
但是当我运行它而不给出任何参数时,似乎alo
它打印了一个完全随机的数字。
我只想知道,既然我想它不可能是100%随机的,这在现实中是多少,它来自哪里,以及我是否可以预测它。请注意,这纯粹是好奇心。
我想它与内存读取有关,但是这个特定的错误究竟是如何运作的呢?
你的alo
函数接受(即requires!)两个参数,但你在没有任何参数的情况下调用它。在这种情况下,行为是未定义的。
您在没有原型的情况下声明了您的函数(在main
之前)。这意味着您有责任在所有对alo
的调用中提供正确数量的正确类型的参数。编译器不会帮助您验证此类调用的正确性。
出于这个原因,一个好主意是 to1 始终使用原型声明您的函数
int alo(int i, int x);
以便编译器将帮助您确保正确调用函数。
在实践中,alo
的实现盲目地遵循其参数传递约定,并读取应该包含参数x
值的存储位置。结果值将从alo
重新调整。
传递x
使用哪种存储位置取决于实现细节。它可以是内存区域或 CPU 寄存器。从alo
返回调用之前驻留在该存储位置的任何残差/垃圾值。
好的,谷歌搜索:
您拥有硬件架构(CPU、寄存器、内存等), 汇编语言 机器码, 指令集, 调试器 叠 调用约定, 参数 参数
当您了解上述内容时,您就可以在显示它的计算机上调查 UB。 下一个框,下一个架构,下周,它的行为可能会有所不同:(