【发布时间】:2022-01-06 11:26:43
【问题描述】:
我正在编队,我们正在看到指针。我们正面临一个谜:
#include <stdio.h>
#include <stdlib.h>
int main()
{
short *p_var = 0;
if (p_var == NULL) {
short var = 123;
p_var = &var;
printf("ma variable= %d \n", *p_var);
}
printf("ma variable= %d \n", *p_var);
return 0;
}
如您所见,此函数的目的是显示有关指针的一些问题,例如范围或空错误。在这里,好的结果是123 和0,由printf 显示,但其他队友有123 和123。我们在同一个 IDE 上工作,我们使用同一个编译器。
你知道会发生什么吗?
【问题讨论】:
-
程序具有未定义的行为,因为变量 var 在 if 语句之后不存在。所以指针在 if 语句后有一个无效值。
-
你怎么会得到
0和123?您的第一个输出使用指向123的有效指针。如果您在第一次打印时收到0,则您显示的代码有问题。你的意思是123和0吗?第二次打印使用指向无效地址的指针。这会导致未定义的行为,并且可以打印任何内容或什么都不打印。为什么0会是这里的“好”案例?它并不比任何其他输出更好或更差。虽然仍然是未定义的,但很有可能是保存123的内存自上次打印以来没有改变,并且该值被再次打印。 -
是的,你是对的,我在问题中犯了一个错误,好的结果是 123 和 0。
-
该值等于 123 而不是 0 或其他值,或者它完全是随机的,这是否有原因?
-
我不会说这是随机的,但几乎不可能找出原因。基本上,编译器假定您永远不会使用未定义的行为并基于该假设优化您的代码。结果可能非常难以预测。