gpt4 book ai didi

c++ - 类型转换的 C++ 指针和非类型转换指针指向相同的位置,但给出不同的值

转载 作者:行者123 更新时间:2023-11-30 03:18:16 26 4
gpt4 key购买 nike

在下面的代码中

#include <string.h> 
#include <iostream>
using namespace std;

int main()
{
int *a;
const int b=5;
a=(int *)&b;
*a=6;
cout<<*a<<b<<endl;
cout<<a<<" "<<&b;

return 0;
}

b 的地址被类型转换并存储到 a 中。所以据我所知,*a 必须指向与 相同的位置b 并且应该给出与 b 相同的值。获取 a 和 &b 的输出表明它们都指向相同的内存位置。但是 a* 和 b 给出了不同的值作为输出。如果我没有对指针进行类型转换,那么我将获得 *a 和 b 的相同值。有人可以帮助我找到这里的错误吗?提前致谢

65
0x7fff2e7969fc 0x7fff2e7969fc

最佳答案

您正在尝试对声明为 const 的变量 (b) 进行写入。这是 C++ 中的 undefined behavior。未定义的行为意味着,程序此时可以做任何,一切都是有效的,包括打印完全错误的数字甚至崩溃。

你首先 promise b 是常量,但你违背了这个 promise 。

编译器通过强制您插入强制转换来提示您不允许执行的操作。如果没有 (int*) 转换,您的代码将无法编译,因为它不是 const 正确的。围绕 const 进行转换通常暗示某些地方不正确。围绕 const 进行强制转换是合法的,但在像您的代码这样的底层变量实际上是 const 的情况下则不行。

允许围绕 const 进行强制转换的情况都涉及到一个非常量变量,并且有一个指向它的 const 指针,然后将 const 指针强制转换为一个非常量的,例如因为你仍然保持逻辑常量,例如你维护一个重要的不变量。但在这些场景中,底层存储始终是非常量。

这很可能发生在您的场景中:

编译器记住您要将值 5 命名为 b。它还意识到您正在使用指向 b 的指针,因此它另外在堆栈上为 b 保留空间。在您尝试读取它之前,它很可能甚至懒得将 5 放入堆栈,但您永远不会这样做。相反,您用 6 覆盖 b 在堆栈上的位置。因此打印语句首先打印 6(用于 b 在堆栈上的位置),然后打印 5(编译器只是在各处插入 5在你使用 b 的地方)。

关于c++ - 类型转换的 C++ 指针和非类型转换指针指向相同的位置,但给出不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54845167/

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