一般的,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的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?開始學的時候,也被此類問題困擾...