我处于阵型中,我们看到了指示。我们面临着一个谜:
#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 并使用相同的编译器。
你知道会发生什么吗?
此代码没有良好的行为:第二个
printf
的行为是未定义。
指针设置在
if
块内,指向在此范围内定义的变量 var
,该变量设置为 123
。第一个 printf
的行为已完全定义,并且确实打印 ma variable= 123
。
当控制离开此块时,变量
var
超出范围,其位置可能用于某些其他目的......或不用于其他目的。
通过指针访问此内存具有未定义的行为。它可能在某些机器上产生值
123
,在其他机器上产生另一个值,例如 0
,并在更奇特的架构上崩溃。行为可以从一个编译器改变到另一个编译器,使用不同的编译器选项,使用不同的操作系统,甚至只是不同的时间......对此无法预测,行为是未定义的。
建议您的老师介绍无效指针等概念,但他们应该说这段代码的任何行为都是“好”或“预期”。请他们解释未定义的行为,这段代码和您的经验就是一个很好的说明。 第一个 printf 给出了正确的结果,因为您在 if 块内声明了变量 var 并使用指针变量来打印其值。