我不明白指针的行为

问题描述 投票:0回答:2

我处于阵型中,我们看到了指示。我们面临着一个谜:

#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 并使用相同的编译器。

你知道会发生什么吗?

c pointers scope
2个回答
1
投票

此代码没有良好的行为:第二个

printf
的行为是未定义

指针设置在

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

当控制离开此块时,变量

var
超出范围,其位置可能用于某些其他目的......或不用于其他目的。

通过指针访问此内存具有未定义的行为。它可能在某些机器上产生值

123
,在其他机器上产生另一个值,例如
0
,并在更奇特的架构上崩溃。行为可以从一个编译器改变到另一个编译器,使用不同的编译器选项,使用不同的操作系统,甚至只是不同的时间......对此无法预测,行为是未定义的。

建议您的老师介绍无效指针等概念,但他们应该说这段代码的任何行为都是“好”或“预期”。请他们解释未定义的行为,这段代码和您的经验就是一个很好的说明。 第一个 printf 给出了正确的结果,因为您在 if 块内声明了变量 var 并使用指针变量来打印其值。


1
投票

© www.soinside.com 2019 - 2024. All rights reserved.