C語言基礎 結構體對齊規則與0位元組陣列

2021-10-08 19:18:39 字數 2490 閱讀 5540

一般的,c語言結構體預設是以4位元組對其方式,以此預設4位元組為依據,結構體對其規則有以下三項:

規則二:struct的總大小為內部最大成員型別的整數倍

示例1:

#

include

#include

#include

#define

debug_printf

(value)

printf

(#value

" ---==> %d\n"

, value)

#define

struct_member_offset

(struct

, member)((

(char*)

(&((

(struct*)

0)->member)))

-((char*)

0))typedef

struct

test_t

;int

main()

輸出結果:

解析:

示例二:

現在將d成員改為uint64型別:

typedef

struct

test_t

;

輸出結果:

還是根據規則解析:

示例三:

現在將結構改為如下,多了乙個資料

typedef

struct

test_t

;

輸出結果:

c成員為3位元組,占用偏移位址8,9,10三個空間,所以總大小還是24。

示例四:

將結構改為如下,現在test_t結構內包含結構sub_t。

typedef

struct

sub_t

;typedef

struct

test_t

;

輸出結果:

解析:

先看一下0位元組陣列的大小:

int

main()

輸出結果:

sizeof(array) ---==

>

0

說明0位元組資料占用空間為0,那麼看下面這個例子:

#

include

#include

#include

#define

debug_printf

(value)

printf

(#value

" ---==> %d\n"

, value)

#define

struct_member_offset

(struct

, member)((

(char*)

(&((

(struct*)

0)->member)))

-((char*)

0))typedef

struct

test_t

;int

main()

輸出結果:

!!奇怪的問題出現了!!

但道理說d成員占用空間為0,sizeof(test_t)應該是12才對,但是sizeof(test_t)卻是16!!

原因:d成員雖然占用空間為0,但是他是uint64型別的,結構體的總大小是按照內部最大成員進行對齊的!test_t對齊到了8位元組,所以sizeof(test_t)的大小為16位元組!

ends…

c語言結構體對齊規則

1.第乙個成員在與結構體變數偏移量為0的位址處。2.其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處。對齊數 編譯器預設的乙個對齊數 與 該成員大小的較小值。vs中預設的值為8 linux中的預設值為4 3.結構體總大小為最大對齊數 每個成員變數除了第乙個成員都有乙個對齊數 的整數倍。4.如果...

c語言 結構體對齊

1 編譯器是按照什麼樣的原則進行對齊的?a.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。b.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。c.指定對齊值 pragma pack ...

C語言結構體對齊

解析c語言結構體對齊 記憶體對齊問題 c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?開始學的時候,也被此類問題困擾...