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

时间:2016-03-14 14:24:19

标签: c++

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

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

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

代码调用未定义的行为,垃圾是一种未定义的行为,但是你的程序也可能导致系统违规并导致崩溃并产生更多后果。

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

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

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