c語言結構體的偏移 c

2021-06-20 15:07:00 字數 1970 閱讀 8705

c語言中關於結構體的位置偏移原則簡單,但經常忘記,做點筆記以是個記憶的好辦法

原則有三個:

a.結構體中的所有成員其首位址偏移量必須為器資料型別長度的整數被,其中第乙個成員的首位址偏移量為0,

例如,若第二個成員型別為int,則其首位址偏移量必須為4的倍數,否則就要「首部填充」;以此類推

b.結構體所佔的總位元組數即sizeof()函式返回的值必須是最大成員的長度的整數倍,否則要進行「末尾填充」;

c.若結構體a將結構體b作為其成員,則結構體b儲存的首位址的偏移量必須為b中所含成員資料長度最大值的整數倍,

如若b中成員為int,double,char,則b的偏移量要為8的整數倍;否則進行「中間填充」

關於c++/c中的sizeof

sizeof(a)返回的是a的型別資料所佔據的位元組數,常見的資料型別位元組數都比較好理解,列出一些比較特殊的以供參考:

1.當定義乙個字元陣列char a(定義時必須賦值否則編譯不通過),且不顯示宣告該陣列的長度時,該陣列的長度為你給他複製時的字元個數+1;

2.結構體中有關位置偏移,見上面;

3.所有指標型別的變數都佔4個位元組;

4.自定義的類class如果不含任何成員則長度為1;否則class和struct 的資料對齊原則一致;

5.sizeof()計算時只計算存放在棧中的空間,static等宣告的全域性變數存放在靜態資料空間不會計算在內;

指標和陣列名的區別:

定義乙個指標char *a="abcd";定義乙個陣列char b="abcd";

則想得到字元『b』時可以通過a[1]與b[1]得到,而且a和b都可以進行加減運算,這樣來看a與b的差別實在不明顯;但a與b的區別還是有,最典型的sizeof(a)=4(指標的空間);sizeof(b)=5(整個陣列的空間);具體參照文章:

sizeof()與strlen()的區別,列舉如下

1.前者可以用於大部分資料型別,後者只用於字元指標;

2.char a="abcd";則sizeof(a)=5;strlen(a)=4;char b[100]="abcd";sizeof(b)=100;strlen[b]=4;strlen在讀到'\0'結束符就停止計數;

3.char a=,char b=;則sizeof(a)=3;strlen(a)=??(實驗了下等於5,不過不知道為什麼??);sizeof(b)=4;strlen(b)=3;證明了第2點;而且注意下char a="abcd";和.char a=這兩種初始化方式的區別,前者會自動補上'\0'結束符,後者不會;

4,看到一句話說sizeof()是數符,而strlen是函式,對理解他們應該沒多大意義,可能在表示式中的地位有點區別;sizeof後面如果是變數名可以省括號,如果是型別名不能省;

關於inline函式注意如下幾點:

1.inline函式的宣告如下:inline 函式宣告;

2.inline函式定義和宣告通常全部放在標頭檔案中,因為inline函式會在編譯階段被替換為函式**,不用到call/return機制,如果在乙個.c中定義內聯函式,則在其他檔案中無法用該函式;巨集在編譯前處理(編譯預處理階段),inline在編譯階段處理;

3.inline函式和巨集的區別在於inline函式在替換時會進行型別檢查,而且inline函式的宣告對於編譯器而言只是建議性的,編譯器會自身優化;

4.虛函式肯定不會是內聯函式,虛函式是在執行時決定呼叫哪個函式,而內聯函式在編譯階段就會被替換為**塊,函式名符號根本就不存在了;

5.內聯函式的主要作用在於節約了資源,消除了乙個call/return機制;

關於虛函式和純虛函式注意以下幾點:

1.虛函式的定義:virtue 函式宣告;純虛函式定義: virtue 函式宣告=0;

2.含有純虛函式的類叫做虛基類,這種類無法直接生成物件;

3.虛函式集中體現了繼承的多型性,及繼承自同乙個基類的不同子類可以表現出不同的性質;虛函式是實用繼承:不僅繼承基類的介面,還繼承基類介面的初始功能,當然這些介面也可以在子類中重新自行定義;純虛函式只是繼承了基類的介面,要實現怎樣的功能都要在子類中定義;

c語言 得到結構體成員偏移

struct stru printf offset of stru.i ld n size t char s.i char s printf struct stru 0 i ld n size t struct stru 0 i 標準庫中定義了函式offsetof type,member 直接使用即...

C語言中結構體偏移量的計算

一 先來一段理論知識 ansi c標準允許任何值為0的常量被強制轉換成任何一種型別的指標,並且轉換結果是乙個null指標,因此 s 0 的結果就是乙個型別為s 的null指標。如果利用這個null指標來訪問s的成員當然是非法的,但 s 0 m 的意圖並非想訪問s欄位內容,而僅僅是計算當結構體例項的首...

關於C語言結構體偏移的一點思考

相信大家在c語言程式開發的過程一定都使用過結構體,那麼不知你對結構體中成員變數偏移這塊是如何理解的?本文將和大家一起分享下,本人最近關於c語言中結構體偏移的一些思考和總結。另外這篇博文還可以幫你更好的理解這個問題c語言中兩種巨集定義的區別,關於這個思考有哪些方面的意義,細心的你可能發現本文所屬的類別...