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语言,指针强制类型转换与内存对齐