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

标签 c arrays windows

我有以下代码

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/

相关文章:

java - 知道在 Windows 机器上要杀死哪个 java.exe 进程

android - 获取图片消息到 C++ 程序

c++ - C WinAPI 和 C++ MFC 资源

c - 为什么相同代码在同一台计算机上的执行时间可能不同?

c - C中的快速排序字符串数组

javascript - 随机唯一数字的大小数组

c - 即使更改代码,仍然会出现段错误

c - connect() 会阻塞 TCP 套接字吗?

javascript - 乘法 2 数组 javascript/jquery

windows - 移动或复制并截断正在使用的文件