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語言,指針強制類型轉換與內存對齊