我有以下代码
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
数组是如何分配的?
最佳答案
您可以将指针视为类型大小说明符。指针大致是与取消引用时要考虑的大小相关联的地址。当声明 int c = 2; int *p = &2;
您将 int 的大小(例如 4 字节)与编译器将定义的地址相关联。当您实际取消引用 p 时,int x = *p
,编译器知道您正在尝试访问地址 p 处的 4 个字节。
现在,如果您成功地以这种方式思考它,那么您的缓冲区为何以这种方式被填满就会一如既往地清楚。您的 unsigned char 数组是一个 65536 字节的缓冲区。当您将地址“buff”转换为 (DATA *) 时,您指定了一个新的大小(DATA 类型的大小)用于取消引用。所以N->a的4bytes会写1000,N->b的4bytes会写50000。
现在,十进制的 1000 是十六进制的 3E8;因为需要写入 4 个字节,所以它将被符号扩展并写入字节 00、00、03、E8,正如您所期望的那样,十进制是字节 0、0、3、232。现在您可能认为它们是以相反的顺序编写,但这是因为字节顺序。字节顺序是处理器实际将字节写入内存的方式,在您的情况下,您的处理器以相反的顺序写入和读取字节,因此它们按此顺序放入内存。 N->b 也是如此,因为十进制的 50000 等于十进制字节 0、0、195、80。
关于c - 使用结构指针赋值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29496192/