我有以下代码
typedef struct
{
int a;
int b;
}DATA;
int _tmain(int argc, _TCHAR* argv[])
{
DATA *N = NULL;
unsigned char buff[65536];
N = (DATA*)&buff;
N->a = 1000;
N->b = 50000;
for(int i =0; i < 8; i ++)
printf("buff[%d]: %d\n", i, buff[i]);
return 0;
}
其中呈现以下输出:
buff[0]: 232
buff[1]: 3
buff[2]: 0
buff[3]: 0
buff[4]: 80
buff[5]: 195
buff[6]: 0
buff[7]: 0
有人可以告诉我buff
阵列被分配的方式吗?
答案 0 :(得分:1)
您可以将指针视为类型大小说明符。指针大致是与解除引用时要考虑的大小相关联的地址。声明int c = 2; int *p = &2;
时,您将int(例如4bytes)的大小与编译器将定义的地址相关联。当您实际取消引用p int x = *p
时,编译器知道您正在尝试访问地址p处的4字节。
现在,如果你成功地以这种方式思考它,为什么你的缓冲区以这种方式填充将如此清晰。 unsigned char数组是65536字节的缓冲区。当你施展地址&#39; buff&#39;在(DATA *)中,您指定了用于解除引用的新大小(DATA类型的大小)。因此,在4字节的N> b上,将在1000字节的N&gt;和50000上写入1000。
现在,十进制的1000是十六进制的3E8;因为需要写入4字节,所以它将被符号扩展,并且将写入字节00,00,03,E8,这是十进制的,如你所料,字节0,0,3,232。现在你可能认为它们是以相反的顺序写,但这是因为结束。 Endianess是处理器实际将字节写入内存的方式,在您的情况下,您的处理器以相反的顺序写入和读取字节,因此它们按此顺序放入内存中。对于N&gt; b也是如此,因为十进制中的50000等于十进制字节,0,0,195,80。
答案 1 :(得分:0)
您以little-endian格式将两个4字节整数写入缓冲区。该程序的行为完全符合预期。