gpt4 book ai didi

c++ - 在 C++ 2017 中将 const 转换为非常量指针并对其进行修改时,编译器将这两个值存储在哪里?

转载 作者:行者123 更新时间:2023-11-28 04:26:08 27 4
gpt4 key购买 nike

在 Visual C++ 2017 中,在试验违反规则时会发生什么时,我发现如果我将 const int 转换为 int *,然后将值重新分配给 int *,调试器将更改值const,但运行时执行不会。

无论我是在 Debug模式下还是作为已发布的可执行文件运行它,都会发生这种情况。我知道它是未定义的,但我正在寻找关于这些值保存位置的见解,因为它们看起来是相同的位置。

const int j = 100;
//int *q = &j; //Compiler disallows
int *q = (int*)&j; //By some magic, now allowed
*q = 300; //After this line, j = 300 in debugger
cout << "j = " << j << endl; //300 in debugger, 100 in console
//^ What is happening here? Where are the two values stored?
cout << "*q = " << *q << endl; //300 in both

//Output:
// j = 100
// *q = 300

这两个值存储在哪里?这就像一个桶同时装满两种不同的液体。

我知道这是未定义的行为,但我想知道是否有人可以阐明内部发生的事情。

最佳答案

前提是有缺陷的。调试器按照相同的 C++17 规则工作,因此它也可以假设没有未定义的行为。这意味着它可以检查源代码并知道 j==100。它没有理由必须检查运行时值。

关于c++ - 在 C++ 2017 中将 const 转换为非常量指针并对其进行修改时,编译器将这两个值存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54272824/

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