使用struct指针分配数组

时间:2015-04-07 16:12:02

标签: 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阵列被分配的方式吗?

2 个答案:

答案 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字节整数写入缓冲区。该程序的行为完全符合预期。