結構體位制詳解 -- C

來源:互聯網
上載者:User

標籤: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;}



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.