【问题标题】:Confusion about the fact that uninitialized pointer points to anywhere对未初始化的指针指向任何地方这一事实感到困惑
【发布时间】:2016-08-10 02:48:15
【问题描述】:
#include <stdio.h>

int main(void)
{
    int *ptr;
    printf("%p", ptr); // Error: uninitialized local variable 'ptr' used
                       // Output is "0"
}

我正在阅读C-FAQ 关于空指针的信息。它说未初始化的指针可能指向任何地方。这是否意味着它指向内存中的随机位置?另外,如果这个陈述是真的,如果我尝试printf("%p",ptr),为什么会出现错误?由于未初始化的指针ptr指向某个随机位置,看来它必须打印出这个随机位置!

【问题讨论】:

  • 它指向一个不确定的位置——你不能轻易预测它会指向哪里,但在任何严格意义上的术语中,它都不太可能是随机的。使用printf("%p", ptr);会出现什么错误?您可能会被告知 %p 需要 void * 而您传递的是 char *(不是同一件事)。您可能看不到任何输出,因为打印结束时没有换行符。你可能正在遭受其他事情的困扰。您尚未显示 MCVE (minimal reproducible example) 或收到的错误消息,因此我们无法为您提供帮助。
  • 为什么不直接指向 null(0x0)?
  • “它说未初始化的指针可能指向任何地方”是真的。 “由于未初始化的指针 ptr 指向某个随机位置”不一定是真的。它也可能有一个陷阱值,当被引用时会杀死代码。它可能具有非法值,无法将其解释为指针。它没有初始化。这是 UB 未定义的行为。
  • @hedron 它可以取决于指针的声明位置/方式。非自动变量(例如全局变量)确实初始化为零。但我猜你在问为什么它不能总是初始化为 0 - 答案是因为 C 是一种极简主义语言。进行隐式初始化需要花费一些东西(例如 cpu 时间)。那么,当正确编写的代码无论如何都会执行显式初始化时,为什么还要支付这笔费用呢?
  • @dave 根据 C 标准它是 UB(使用未初始化的变量)

标签: c pointers initialization


【解决方案1】:

单元化的auto 变量(指针类型或其他)的内容是不确定的;实际上,它是最后写入该内存位置的任何内容。这种随机位模式对应于程序中有效地址1 的几率非常低;它甚至可能是一个陷阱表示(一种不对应于该类型的合法值的位模式)。

尝试取消引用无效的指针值会导致未定义的行为; 任何结果都是可能的。您的代码可能会彻底崩溃,它可能在没有明显问题的情况下运行,它可能会使您的系统处于不良状态。


  1. 即你的程序中定义的对象或函数的地址,或者是用malloc或类似分配的动态对象。

【讨论】:

  • 事实上,取消引用一个未初始化的指针总是有未定义的行为,即使它包含一些有效对象的地址是巧合。该标准明确说明了这一点;请参阅N1570 6.3.2.1p2(感谢 M.M 的引用)。
  • 您可能需要考虑修改此答案,该变量是一个自动变量,它的地址从未被占用,它是 UB 中的 UB,即使您执行 null检查它...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多