这是滥用void* ptr的示例(这本身是一种不良的编码实践),但是当我查看内存详细信息时,它会变得很有趣。

#include <iostream>
using namespace std;

typedef struct {
  long a;

  void print() {
    std::cout << a;
  }
} st;

int main() {
    int t[2] = {1,2};
    void* p = t;
    st* spt = (st*) p;
    spt->print();
    return 0;
}

由于long是64位,而int是32位,因此t中的两个整数{1,2}构成了long astruct的空间。

但是我的问题是,由于现在{1,2}组成了a,因此二进制内存对齐方式应该是00000000000000000000000000000001 00000000000000000000000000000010,它应该以十进制格式给出4294967298。但是,实际的打印输出是8589934593,即00000000000000000000000000000010 00000000000000000000000000000001。看来12的位置实际上已交换。

为什么会这样呢?

最佳答案

在小端机上,您的{ 1, 2 }数组按以下字节序列排列在内存中

01 00 00 00  02 00 00 00   // addresses increase from left to right

当重新解释为64位little-endian值时,它将生成8589934593

在big-endian机器上,将相同的数组布置为
00 00 00 01  00 00 00 02   // addresses increase from left to right

当重新解释为64位big-endian值时,它将生成4294967298

因此,您的实验仅表明您在低端字节序的计算机上运行代码。这里的所有都是它的。

关于c++ - 为什么此程序输出8589934593而不是4294967298?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33578360/

10-08 22:04