gpt4 book ai didi

c++ - 为什么这个指针在其对象应该超出范围时有效? (以及其他一些奇怪的行为)

转载 作者:行者123 更新时间:2023-11-30 03:29:52 24 4
gpt4 key购买 nike

<分区>

我对 c++ 还是个新手,一直在研究对象作用域。
我测试了下面的代码并目睹了一些奇怪的行为。

struct Test
{
int value, value2;
Test() : value(1), value2(10) {};
};


Test* GetTestPointer() {
Test t;
t.value = 20;
return &t;
}

int main() {
Test* tp = GetTestPointer();
int a = tp->value;
int b = tp->value2;
cout << a << endl;
cout << b << endl;

return 0;
}

输出:

20
10

我认为 Test t 会超出范围,因此在 main 中取消引用它的值会引发异常或空值。为什么它会获得有效值,就好像对象还活着一样?

实际上这是我最初尝试的:

Test* tp = GetTestPointer();
cout << tp->value << endl;
cout << tp->value2 << endl;

输出:

20
18223279

这里 value2 表现得好像它是无效的,但我可以得到 value 就好了。
相反,我尝试重新排序它们:

Test* tp = GetTestPointer();
cout << tp->value2 << endl;
cout << tp->value << endl;

输出:

10
1459403656

请注意,当我使用 new 正确启动 tp 时,这一切都没有发生,正如预期的那样。

我知道我在现实生活中永远不会写这样的代码,但我真的很好奇为什么会发生这种情况。

  1. 在这种情况下,t 什么时候超出范围?
  2. cout 的顺序与 tp 取消引用有什么关系?
  3. 为什么当我将它们保存在缓冲区中时我可以获得正确的值?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com