[英]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.