我有以下代码
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
arrays被分配?
您可以将指针看作是字符大小说明符。 指针大致是一个地址,与解引用时要考虑的大小相关联。 当声明int c = 2; int *p = &2;
int c = 2; int *p = &2;
你将int的大小(比如4字节)与编译器定义的地址相关联。 当你实际解引用p, int x = *p
,编译器知道你正在尝试访问地址为p的4字节。 现在,如果你这样成功地思考这个问题,那么为什么你的缓冲区被这种方式填补将是如此清晰。 你的无符号字符数组是一个65536字节的缓冲区。 当您将地址'buff'转换为(DATA *)时,您将指定新的大小(数据类型的大小)以取消引用。 因此,1000将写在N> a的4字节和50000的N→b的4字节上。 现在,十进制1000是十六进制的3E8; 由于需要写4个字节,所以将会被扩展符号,并将被写入字节00,00,03,E8,十进制中的字节如你所期望的那样是字节0,0,3,232。现在你可能会认为它们是写在相反的顺序,但这是由于endianess。 Endianess是处理器实际将字节写入内存的方式,在您的情况下,您的处理器按照相反的顺序写入和读取字节,因此它们按照此顺序存储在内存中。 对于N-> b也是如此,因为十进制中的50000等于十进制字节0,0,195,80。
您以小尾数格式将两个4字节整数写入缓冲区。 该计划的行为完全如预期。