指针与内存对齐

本文探讨了在处理连续数组时,指针转换和内存对齐的问题。通过示例说明,当数组未正确对齐时,强制转换指针访问数据可能导致运行时错误。在32位处理器中,如果结构体成员未按字节对齐,使用指针访问可能导致致命错误,强调了内存对齐在编程中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值