C中的内存寻址

时间:2017-03-28 17:02:25

标签: c

我用C:

制作了这个小代码
#include <stdio.h>

int alo();

int main()
{
    printf ("%d",alo());
}

int alo(int i, int x)
{
   return (x);
}

但似乎当我在没有给alo任何参数的情况下运行它时,它会打印一个完全随机的数字。

我只是想知道,因为我认为它不能100%随机,这实际上是多少,它来自何处,以及我是否可以预测它。请注意,这是纯粹的好奇心。

我想它有一些东西可以处理内存阅读,但这个特定的bug究竟是如何起作用的呢?

2 个答案:

答案 0 :(得分:5)

你的alo函数接受(即需要!)两个参数,但你没有任何参数调用它。在这种情况下,行为是未定义的。

你在没有原型的情况下声明了你的函数(在main之前)。这意味着您有责任在alo的所有调用中提供正确数量的正确类型的参数。编译器不会帮助您验证此类调用的正确性。

出于这个原因,一个好主意是总是用原型声明你的函数

int alo(int i, int x);

这样编译器可以帮助您确保正确调用函数。

在实践中,alo的实现盲目地遵循其参数传递约定并读取应该包含参数x的值的存储位置。结果值从alo返回。

用于传递x的存储位置取决于实现细节。它可以是存储区域或CPU寄存器。在从alo返回呼叫之前,无论残留/垃圾值是否存在于该存储位置。

答案 1 :(得分:-1)

好的,谷歌:

你拥有硬件架构,(CPU,寄存器,内存等), 汇编, 机器码 指令系统, 调试器, 堆, 召集会议, 参数, 参数

当您了解上述内容后,您就可以在其显示的计算机上调查UB。下一个框架,下一个架构,下周,它可能表现不同:(