【问题标题】:Why does printing out a pointer to an uninitialized variable cause a segmentation fault? [duplicate]为什么打印出指向未初始化变量的指针会导致分段错误? [复制]
【发布时间】:2019-09-03 00:42:44
【问题描述】:

我试图弄清楚为什么将指针分配给未初始化的变量然后打印指针及其值会导致分段错误。根据我对 C++ 的了解,打印 p 应该只给出 x 的地址,而打印 *p 应该只给出随机分配给 x 的任何垃圾值。

int x;
int* p = &x;
cout << p << *p << endl;

【问题讨论】:

  • 如果您尝试访问未初始化的变量,则行为未定义。
  • @gman "为我工作" 在这里并不适用。 UB 可能总是“为你工作”,但它仍然是 UB。
  • “随机分配给 x 的任何垃圾值” 未初始化的变量不仅仅是包含垃圾的变量。它的价值是不确定的,这是一个特殊的特性。尝试读取它的价值是UB。通常,您会得到垃圾,但任何事情都可能发生。幸运的是,您刚刚观察到了不同的行为。也许编译器推断出永远不能达到*p,并且做了一些优化会破坏您的代码或发生其他事情。但底线是 *p 在这里是非法的,任何事情都可能发生,包括段错误。
  • 我很想知道您是如何编译它以使其崩溃的。这将是说明 UB 后果的理想示例。
  • 这令人惊讶,即使对于未定义的行为也是如此,因为除了天真的事情之外,做任何事情都没有明显的优化好处。但它仍然需要复制者来进一步分析。

标签: c++


【解决方案1】:

在打印 *p 时应该只给出随机分配给 x 的任何垃圾值。

不确定您从哪里得到这种印象,但它是基于错误的假设或错误的期望。标准规定并且编译器的创建者遵循直接通过使用变量名或间接地、使用指针或尊敬来读取未初始化变量的值导致未定义的行为。因此,在这种情况下,分段错误可能是您获得的最佳结果,因为它可以让您更轻松地修复代码中的错误,而不是获得一些随机值。但是请注意,您也不能期望发生分段错误,当您进入 UB 领域时,您不能期望任何特定的事情。不这样做是你作为开发人员的工作。

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多