什么问题?悬空指针?

3

5
你让一个指针指向一个栈变量,但是该变量已经被销毁了,然后又对该指针进行解引用,导致产生未定义的行为。 - Seth Carnegie
1
未定义行为意味着您可能会得到预期的输出(http://ideone.com/VMYzG),也可能得到其他结果(http://codepad.org/OiN8n1L0)。 - UncleBens
5个回答

8

这只是未定义行为。在该变量超出作用域后,您正在使用指向局部变量的指针。任何事情都可能发生。


所以 #1 应该输出一个随机数? - bitstore
2
@tinybit:你需要意识到,推断“应该”发生什么是毫无意义的。这属于未定义行为 - unwind
@tinybit:它不应该做任何具体的事情。“什么都有可能发生”。 - Oliver Charlesworth
我明白了。10个问题中的第1个让我感到困惑,我原以为是正确的。谢谢! - bitstore
@tinybit 10 是一个随机数 :) - Seth Carnegie

3

这确实是一个悬空指针。

你将p赋值为指向自动(局部)对象的指针。一旦fun返回,对象就不存在了,通过p尝试访问它将导致未定义的行为。

如果你对为什么观察到特定的行为感兴趣:在大多数平台上,fun的栈帧直到另一个函数被调用才会存在。因此,在第一次调用<<时读取p很可能会找到i的旧值。在调用<<之后,旧的栈帧很可能已经被覆盖,因此读取p将找到任意值。但这些都不是你可以依赖的行为;访问死亡的对象可能会导致崩溃或其他任何行为。


+1 表示对输出可能原因的解释。虽然 UB 不能被依赖,但我们需要能够识别其影响。可能的原因包括内存泄漏、未初始化变量、指针错误等。 - UncleBens

1

是的,一旦fun()返回,p就成为了悬空指针。


1

您正在保存一个超出作用域的变量的指针。因此,行为未定义。它可能会输出任何内容,甚至导致应用程序崩溃。甚至可能导致您的计算机爆炸。


1

你的函数返回一个指向被覆盖的内容的指针:

int i = 10;
p = &i; // This line

因为 i 是一个局部变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接