这段代码在做什么?涉及字符数组和指针(C ++)

时间:2012-03-01 01:05:26

标签: c++ arrays pointers

unsigned char myArray[10];

myArray[0] = 0;
myArray[1] = 0;
myArray[2] = 0;
myArray[3] = 22;

cout << *((int *) (myArray)) << endl;

我在课堂上看到了这段代码,但没有得到很好的解释。我已经确定输出等于(256 ^ 3)* 22,但我不知道为什么这是它打印出来的。任何人都可以向我解释这个吗?

2 个答案:

答案 0 :(得分:3)

该代码不安全且不可移植。

它(显然)在myArray的前4个元素中存储值0,0,0和22,每个元素都是unsigned char(单个字节)。

表达式myArray是一个数组的名称,在大多数情况下(包括这个),“衰减”到指向数组的unsigned char*类型的第一个元素的指针。强制转换将unsigned char*转换为int**运算符会将该指针转换为int结果。

因此*((int *) (myArray))myArray的前4个字节和重新解释作为int对象。

至少有3个问题。

  1. 无法保证myArray对象int正确对齐。 可能是,但如果不是,则行为未定义;你可能会得到一个总线错误,或者一个错误的结果,或者其他一些东西。 (x86处理器在对齐方面不是很挑剔,但其他系统都是。)
  2. 无法保证sizeof (int) == 4。如果int是8个字节,那么它会将myArray的第一个 8 字节重新解释为int - 其中4个字节是垃圾。
  3. int的表示形式可能有所不同。主要问题是字节顺序。假设没有其他错误,结果可能是256 3 * 22,或22 - 或甚至其他。

答案 1 :(得分:2)

最后一行重新解释myArray的地址作为指向int的指针,取消引用它并打印它。在32位系统上,int长度为四个字节,因此通过myArray[0]的{​​{1}}正在作为myArray[3]进行处理。 int的感知价值取决于endianness