任何人都可以解释一下这个C++代码在做什么
Can anyone please explain what this C++ code is doing?
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)
字节,则只有一个字节将被a
(0x61
ASCII),但其他字节的值未确定(也称为垃圾)。 事实上,在某些体系结构上,从未初始化的内存中读取可能会导致问题:例如,在valgrind
下,这将导致向用户显示警告。
以上都是猜测,未定义的行为意味着任何事情都可能发生。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值