C 语言中的内存寻址

  • 本文关键字:内存 寻址 语言 c
  • 更新时间 :
  • 英文 :


我用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。 下一个框,下一个架构,下周,它的行为可能会有所不同:(

最新更新