指针与内存对齐

        当低长度的边续数组,我们会用指针转换成高长度的数据直接使用。指针做强制变换时,
需要注意内存是否对齐,否则会引起错误。例如:


uint8_t  u8Data[2];
uint16_t *pu16Pnt;


pu16Pnt = (uint16_t *)u8Data;


    这样用*pu16Pnt就可以直接访问16位的数据;我们平时这样用,没有出错。但是,我们应该庆幸,
这仅是刚好没有出错。因为我们新定义的数组变量u8Data,是刚好在内存中(32位处理器)对齐。
    如下就是一个错误的例子:
    
    typedef struct
    {
       uint8_t  u8Data[2];
       uint16_t u16Data[4];
    }DATA_FRAME;


    DATA_FRAME g_Frame;
    uint32_t   *pu32Pnt;


    *pu32Pnt = (uint32_t*)g_Frame.u16Data;
    *pu32Pnt =  ......
    
    如上,代码实现了将2个16位的数据按32位组合后,用*pu32Pnt直接访问;编译时,编译器也不会报错。
但运行时,会有致命的错误。为什么呢?

    因为在32位的计算机中,我们定义的结构体中,u16Data[2] 这个数组存储时,并不在对齐位置;

    

      uint32_t* 的指针,并没有指向以4为倍数的内存地址,所以取值或赋值时,就会产生错误;

如果数据结果是对齐的,则不会产生错误,如下面结构:

    typedef struct
    {
       uint8_t  u8Data[4];
       uint16_t u16Data[4];
    }DATA_FRAME;


你可能感兴趣的:(C,语言)