【问题标题】:I don't understand the behavior of a pointer我不明白指针的行为
【发布时间】: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;
}

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

你知道会发生什么吗?

【问题讨论】:

  • 程序具有未定义的行为,因为变量 var 在 if 语句之后不存在。所以指针在 if 语句后有一个无效值。
  • 你怎么会得到0123?您的第一个输出使用指向123 的有效指针。如果您在第一次打印时收到 0,则您显示的代码有问题。你的意思是1230 吗?第二次打印使用指向无效地址的指针。这会导致未定义的行为,并且可以打印任何内容或什么都不打印。为什么0 会是这里的“好”案例?它并不比任何其他输出更好或更差。虽然仍然是未定义的,但很有可能是保存 123 的内存自上次打印以来没有改变,并且该值被再次打印。
  • 是的,你是对的,我在问题中犯了一个错误,好的结果是 123 和 0。
  • 该值等于 123 而不是 0 或其他值,或者它完全是随机的,这是否有原因?
  • 我不会说这是随机的,但几乎不可能找出原因。基本上,编译器假定您永远不会使用未定义的行为并基于该假设优化您的代码。结果可能非常难以预测。

标签: c pointers scope


【解决方案1】:

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

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

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

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

建议你的老师引入无效指针等概念,但他们应该说这段代码的任何行为都是好的预期的。请他们解释未定义的行为,这段代码和你的经验是一个很好的例子。

【讨论】:

  • @thomasrocheteau: 简单的古董,quelle form suis-tu?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多