【发布时间】: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++