繁体   English   中英

谁能解释这个C ++代码在做什么?

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

char b = 'a';
int *a = (int*)&b;
std::cout << *a;

*a的内容*a什么? 它显示了垃圾值。 谁能解释一下。 为什么?

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

您可以使用数据类型char初始化变量。c++中的char应该具有1个字节,而int应该包含2个字节。 您的a指向b变量的地址...地址应定义为任何十六进制数。 每次调用此“程序”时,都应该有其他十六进制数,因为如果您重新启动该程序,则调度程序会将其他任何地址分配给您的变量。

根据字节顺序,第一个或最后一个字节应为十六进制61。 其他三个字节是垃圾。 最好将int更改为unsigned int并将cout更改为十六进制。

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

将其视为字节块。 字符有一个字节块(8位)。 如果设置了转换(int *),则将从char地址中获取接下来的7个字节块。 因此,您将获得7个随机字节块,这意味着您将获得一个随机整数。 这就是为什么您获得垃圾值。

该代码调用未定义的行为,垃圾是未定义的行为的一种形式,但是您的程序也可能会导致系统冲突并崩溃,从而带来更多后果。

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

  • 如果地址未对齐并且处理器不支持未对齐的访问,则可能会收到系统特定的信号或异常。
  • 如果地址离段的末尾足够近,访问超出第一个字节会导致段冲突,那就是您可以得到的。
  • 如果处理器可以读取sizeof(int)在地址字节,只有那些之一将是a ,( 0x61在ASCII),但该有的都有了待定值(又名垃圾 )。 实际上,在某些体系结构上,从未初始化的内存读取可能会引起问题:例如在valgrind下,这将导致向用户显示警告。

以上都是推测,未定义的行为表示可能发生任何事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM