程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> struct-數組和結構體對齊關系,求大神解決!

struct-數組和結構體對齊關系,求大神解決!

編輯:編程解疑
數組和結構體對齊關系,求大神解決!

#include
typedef struct
{

unsigned char a;

unsigned char b;
unsigned int c;

unsigned short d;

unsigned int e;
} ABC;

const unsigned short code1[6] = {0x1607,0x1003,0x1008,0x2001,0x3002,0x4003};
void main(void)
{
ABC * p = (ABC *)&code1[0];
printf("%X\n",p->c);

}
請問:輸出的是 0x20011008
為什麼不是0x10081003 ?

最佳回答:


這個確實和字節對齊有關系,前提是編譯器是32-bit的。
在內存中映射的數據,是這樣的:
07 16 03 10 08 10 01 20 02 30 03 40
對於int型,每個占用4個byte,必須是4字節對齊。所以起始地址必須是4的倍數。這是編譯器優化的結果。
所以一般在定義結構體的時候,為了避免這個問題,我們往往會重新組織一下數據,進行4字節對齊:
typedef struct
{
unsigned char a;
unsigned char b;
unsigned short d; d和c換一下位置。
unsigned int c;
unsigned int e;
} ABC;
如果不能交換位置,比如圖形文件的header,必須是字節一一對齊。那一般采用這個方式:
typedef struct
{
unsigned char a;
unsigned char b;
unsigned char c[4];
unsigned char d[2];
unsigned char e[4];
} ABC;
然後根據平台的大小端轉換成正確的值

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved