我不明白指针的行为

I don't understand the behavior of a pointer

我在编队中,我们看到了指示。我们正面临一个谜 :

#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;
}

如您所见,此函数的目的是显示有关指针的一些问题,例如范围或空错误。在这里,好的结果是 1230,由 printf 显示,但其他伙伴有 123123。我们使用相同的 IDE 并使用相同的编译器。

你知道会发生什么吗?

第一个 printf 给出了正确的结果,因为您在 if 块中声明了一个变量 var 并使用了一个指针变量来打印它的值。

此变量的范围仅在 if 块内。 for 循环外部是一个无效指针,因为 c 中的指针用于存储变量的地址,而您尚未在 if 块外部存储 ant 地址。

此代码没有好的行为:第二个printf的行为是未定义

指针设置在 if 块内以指向在此范围内定义的变量,var 设置为 123。第一个 printf 的行为已完全定义并确实打印 ma variable= 123 .

当控件离开此块时,变量 var 超出范围,它的位置可能会用于其他目的...或不会。

通过指针访问此内存具有未定义的行为。它可能会在某些机器上产生值 123,在其他机器上产生另一个值,例如 0,并在更奇特的体系结构上崩溃。行为可以从一个编译器更改为另一个编译器,使用不同的编译器选项,使用不同的操作系统,甚至只是不同的时间......没有什么可以预测的,行为是未定义的。

建议您的老师介绍无效指针等概念,但他们应该说此代码的任何行为都是 goodexpected。请他们解释未定义的行为,这段代码和您的经验是一个很好的例证。