gpt4 book ai didi

c - 使用结构指针赋值数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:39:58 27 4
gpt4 key购买 nike

我有以下代码

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com