指针强制类型转换触发内存自动对齐
生活随笔
收集整理的這篇文章主要介紹了
指针强制类型转换触发内存自动对齐
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C語言的指針是我們操作很靈活,但是也留下了不少坑,今天工作遇到了一個指針的坑,這里復(fù)現(xiàn)一下:
指針類型強制轉(zhuǎn)換,并進行解引用,引起的內(nèi)存對齊問題.(一)問題復(fù)現(xiàn):
運行環(huán)境: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#(二)問題解析:
我這里使用的編譯器并沒有任何問題,在我自己的電腦無論如何都復(fù)現(xiàn)不了該問題,該問題可能有的編譯器進行了優(yōu)化,所以我們看不到現(xiàn)象,但是當(dāng)我們進行指針強制類型轉(zhuǎn)換時要注意字節(jié)對齊,當(dāng)我們對char指針類型轉(zhuǎn)換為ULONG類型時,在賦值操作采用memcpy進行操作,否則可能出現(xiàn)意想不到的錯誤
這篇文章中樓主復(fù)現(xiàn)了該問題:C語言,指針強制類型轉(zhuǎn)換與內(nèi)存對齊
總結(jié)
以上是生活随笔為你收集整理的指针强制类型转换触发内存自动对齐的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三一重工是什么板块
- 下一篇: 年利率12%怎么算利息