標籤:blog 使用 os io 2014 問題 ar amp
我基本總結下面4部分:
1、佔位大小問題。
2、位元組對齊問題。
3、特殊保留位0。
4、該結構體在記憶體中存放位置。
#include <stdio.h>#include <stdlib.h>#include <string.h>//基本概念/*struct _M{(1)類型 參數名 : 佔位大小;(2)類型 : 佔位大小;}(1)類型 -- int,unsigned(32位),short,char。參數名 -- 同個結構體裡面不能重名參數。佔位大小 -- 不能大於類型最最大位元。(2) 一般用於寄存器中保留位*///佔位大小問題:/*err -- int類型是32位,34大於32位,所以編譯出錯。struct _A {int x1:34;};err -- char類型是8位,9大於8位,所以編譯出錯。struct _A1 {char x1:9;};*///位元組對齊/*位移量 -- 類型和佔位大小影響(與結構體位元組對齊差不多意思)。*/struct B {char x1:1;//1位,位元組對齊佔1位元組,8位。char x2:8;char x3:1;char x4:8;char x5:1;};struct C {char x1:4;char :1;char x2:3;};struct _C {char x1:4;char :8;char x2:3;};//特殊保留位0struct C1 {char x1:4;char :0;//這個0佔了4個位元組char x2:3;};struct _C1 {char x1:4;char :4;//這個0佔了4個位元組char x2:3;};//記憶體中存放順序struct D {char x1:1;//最低位char x2:1;char x3:1;char x4:1;char x5:1;char x6:1;char x7:1;char x8:1;//最高位};intmain(){ //位元組對齊B b;printf("sizeof(b) = %d\n", sizeof(b));C c;printf("sizeof(c) = %d\n", sizeof(c));_C _c;printf("sizeof(_c) = %d\n", sizeof(_c));//特殊保留位0C1 c1;printf("sizeof(c1) = %d\n", sizeof(c1));memset(&c1, 0, sizeof(c1) );c1.x1 = 0xf;c1.x2 = 0x7;printf("c1 = 0x%x\n", c1);_C1 _c1;printf("sizeof(_c1) = %d\n", sizeof(_c1));memset(&_c1, 0, sizeof(_c1) );_c1.x1 = 0xf;_c1.x2 = 0x7;printf("_c1 = 0x%x\n", _c1);//記憶體中存放順序D d;memset(&d, 0, sizeof(d) );printf("d = 0x%08x\n", d);d.x1 = 1;printf("d = 0x%08x\n", d);}/*[[email protected] test_class]# gcc quote.cpp ;./a.outsizeof(b) = 5sizeof(c) = 1sizeof(c1) = 2c1 = 0x70fsizeof(c2) = 3d = 0x00000000d = 0x00000001[[email protected] test_class]# gcc quote.cpp ;./a.outsizeof(b) = 5sizeof(c) = 1sizeof(_c) = 3sizeof(c1) = 2c1 = 0x70fsizeof(_c1) = 2_c1 = 0x70fd = 0x00000700d = 0x00000701*/
下面是別人的部落格:
在使用結構體位制的時候有兩點要特別注意:1.//位段成員的類型僅能夠為unsigned或者int2.unsigned b:4; unsigned :0; //定義長度為0的位段時不能指定名字,否則編譯不過 unsigned d:1; //定義了0欄位後,緊接著的下一個成員從下一個儲存單元開始存放; //此例子中,d前面那個儲存單元中的餘下的27位中被0填充了/* DATE : 2010.6.24 關於C中的位端igned或者int*/#include <stdio.h>typedef struct _A{ unsigned int a:4;//位段成員的類型僅能夠為unsigned或者int unsigned b:4; unsigned c:2; unsigned d:6; unsigned E:1; unsigned D:2; unsigned T:3; unsigned A:9; unsigned h:4; //前面已經為31,故4+31>32已超過一個儲存單元,所以4在一個新的儲存單元存放 unsigned y:29;//由於前面的4在一個新的儲存單元的開頭存放,且29+4>32, 故在另一個新的儲存單元存放}A; //所以最後求出的A的大小是4 + 4 + 4 =12/*對上面的具體解釋: 一個位段必須儲存在同一個儲存單元中,不能跨兩個單元.如果某儲存單元空間中不能容納 下一個位段,則改空間不用,而從下一個儲存單元起存放該位段. 結構體A中的h和y就是這種情況. 在gcc環境下,測試後,一個儲存單元為4個位元組.*/typedef struct _S{ unsigned a:4; unsigned b:4; unsigned c:22; unsigned q:1; unsigned h:1; //unsigned i:33; // 錯誤:‘i’ 的寬度超過它自身的類型 //unsigned i:1;當多出此行時,該結構體大小由4變為8,因為此行之前正好為32位} S;typedef struct _T{ //當沒有佔滿一個儲存單元時,結構體的大小對齊為一個儲存單元的大小 unsigned a:2; unsigned b:2; unsigned j:1; unsigned : 1;//可以定義無名位段,此例中該無名位段佔用1位的空間,該空間將不被使用} T;typedef struct _V{ unsigned a:1; unsigned b:4; unsigned :0; //定義長度為0的位段時不能指定名字,否則編譯不過 unsigned d:1; //定義了0欄位後,緊接著的下一個成員從下一個儲存單元開始存放;}V; //此例子中,d前面那個儲存單元中的餘下的27位中被0填充了int main(){ A a; S s; T t; V v; printf("sizeof(a)=%d\n", sizeof(a)); printf("sizeof(s)=%u\nsizeof(t)=%u\n", sizeof(s), sizeof(t)); printf("sizeof(v)=%d\n", sizeof(v)); return 0;}