指针强制类型转换触发内存自动对齐

C语言的指针是我们操作很灵活,但是也留下了不少坑,今天工作遇到了一个指针的坑,这里复现一下:

   指针类型强制转换,并进行解引用,引起的内存对齐问题.
(一)问题复现:

运行环境:Ubuntu 16.04

#include <stdio.h>

int main(void)
{
    char cTestBuffer[10] = {0,1,2,3,4,5,6,7,8,9};
    char *pcData = &cTestBuffer[5];
    int  iDest =0;
    int  i=0;
    for(i=0;i<10;i++)
    {
        printf("cTestBuffer[%d]=0x%08x\n",i,&cTestBuffer[i]);
    }
    printf("pcData指针地址=0x%08x\n",pcData);
    iDest = *(int *)pcData;
    printf("iDest实际值=0x%08x\niDest期望值=0x%02x%02x%02x%02x\n",
    iDest,pcData[3],pcData[2],pcData[1],pcData[0]);

}
            ^
root@virtual-machine:~/test# ./a.out 
cTestBuffer[0]=0x3139ca70
cTestBuffer[1]=0x3139ca71
cTestBuffer[2]=0x3139ca72
cTestBuffer[3]=0x3139ca73
cTestBuffer[4]=0x3139ca74
cTestBuffer[5]=0x3139ca75
cTestBuffer[6]=0x3139ca76
cTestBuffer[7]=0x3139ca77
cTestBuffer[8]=0x3139ca78
cTestBuffer[9]=0x3139ca79
pcData指针地址=0x3139ca75
iDest实际值=0x08070605
iDest期望值=0x08070605
root@lvirtual-machine:~/test# 
(二)问题解析:

我这里使用的编译器并没有任何问题,在我自己的电脑无论如何都复现不了该问题,该问题可能有的编译器进行了优化,所以我们看不到现象,但是当我们进行指针强制类型转换时要注意字节对齐,当我们对char指针类型转换为ULONG类型时,在赋值操作采用memcpy进行操作,否则可能出现意想不到的错误

这篇文章中楼主复现了该问题:C语言,指针强制类型转换与内存对齐

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值