【问题标题】:Pointer points to uninitialized variable指向未初始化变量的指针
【发布时间】:2017-09-11 05:36:06
【问题描述】:

在以下程序中,ptr 指向未初始化变量x。在打印ptr之前,我已经将10分配给ptr并打印了。

#include <stdio.h>

int main()
{
    int *ptr;
    int x;

    ptr = &x;
    *ptr = 10;

    printf(" x = %d\n", x);
    printf(" *ptr = %d\n", *ptr);
}

ptrx 都打印正确的值。但是,我有疑问,这是定义的行为吗?

【问题讨论】:

  • 请阅读。为什么你认为它会被定义或未定义?你的研究工作在哪里?你发现了什么你不明白的地方?添加这些是一个很好的问题,没有冒犯。
  • 只有当您访问未初始化变量的值时,才会调用可能定义不明确的行为。
  • 您能否解释一下“在取消引用ptr 之前,我已将10 分配给ptr 并取消引用它”是什么意思。 ?将10分配给*ptr(不是ptr是取消引用。在取消引用之前先取消引用?

标签: c pointers initialization behavior


【解决方案1】:

是的,是的。您将有效值分配给ptr,然后使用间接将有效值分配给x

x 这样的变量的地址和它的值是不同的东西。分配存储后,无论变量中的值如何,获取地址始终是明确定义的。

【讨论】:

  • (尽管编译器可能仍然优化这些好像,因为指针永远不会在任何地方传递)
  • @AnttiHaapala - 是的,当然可以。然而,代码的行为仍然会被定义。
【解决方案2】:

是的,因为当您声明 x 时,占位符/内存将变为可用 给你。

ptr = &x; *ptr = 10; 代码有效地意味着

x =10

【讨论】:

    【解决方案3】:

    据我了解,这是已定义的行为,因为在写入之前不需要初始化内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多