任何人都可以解释一下这个C++代码在做什么

Can anyone please explain what this C++ code is doing?

本文关键字:C++ 代码 什么 一下 解释 都可以 任何人      更新时间:2023-10-16
char b = 'a';
int *a = (int*)&b;
std::cout << *a;

*a的内容可能是什么?它显示垃圾值。你能解释一下吗?为什么?

假设 char 在内存中占用一个字节,int 占用两个字节(确切的字节数取决于平台,但通常它们对于 char 和 int 并不相同)。将a设置为指向与 b 相同的内存位置。在b的情况下,取消引用将只考虑一个字节,因为它是 char 类型。在a的情况下,取消引用将访问两个字节,因此将打印存储在这些位置的整数。这就是为什么你会得到垃圾:第一个字节是'a',第二个是随机字节——它们一起给你一个随机整数值。

第一个或最后一个字节应为十六进制 61,具体取决于字节顺序。其他三个字节是垃圾。最好将 int 更改为无符号 int,并将 cout 更改为十六进制。

我不知道为什么有人想这样做。

您使用数据类型初始化变量 char ...C++ 中的char应具有 1 个字节,int应包含 2 个字节。您的a指向b变量的地址...地址应定义为任何十六进制数。每次你调用这个"程序"时,都应该有任何其他十六进制数字,因为如果你启动这个程序,调度程序会为你分配任何其他地址是一个变量。

把它想象成字节块。Char 有一个字节块(8 位)。如果您设置了转换 (int*),那么您将从字符的地址中获得接下来的 7 个字节块。因此,你会得到 7 个随机字节块,这意味着你会得到一个随机整数。这就是你得到垃圾值的原因。

代码调用

未定义的行为,垃圾是未定义行为的一种形式,但您的程序也可能导致系统违规和崩溃,并带来更多后果。

int *a = (int*)&b;使用char的地址初始化指向int的指针。 取消引用此指针将尝试从该地址读取int

    如果地址未对齐,
  • 并且处理器不支持未对齐的访问,则可能会收到系统特定的信号或异常。
  • 如果地址足够接近段的末尾,超出第一个字节的访问会导致段冲突,这就是您可以得到的。
  • 如果处理器可以读取地址处的sizeof(int)字节,则只有一个字节将被a0x61 ASCII),但其他字节的值未确定(也称为垃圾)。 事实上,在某些体系结构上,从未初始化的内存中读取可能会导致问题:例如,在valgrind下,这将导致向用户显示警告。

以上都是猜测,未定义的行为意味着任何事情都可能发生。