結構體成員offset和size
結構體對齊
結構體成員比較
如何計算結構體成員在結構體中的偏移
s為結構體,m為結構體成員
結構體中包含結構體成員情況見下面的定義,example_struct為結構體型別的成員
#ifdef exfo
#undef exfo
#endif
#define exfo(s,m) ((size_t)&(((s *)0)->m)),(sizeof(((s *)0)->m))
#ifdef info
#undef info
#endif
#define info(s,m) ((size_t)&( (( (s *)0 )->example_struct).m)), ((sizeof(((s *)0)->example_struct).m))
//example_struct是結構體內的成員,但成員本身是另乙個結構體
typedef
struct off_size
off_size
typedef
struct _example_0
example_0;
typedef
struct _example_1
example_1;
off_size example0_off_size=
,//,
,//,
,//,
,//,};
off_size example1_off_size=
,,,,
,,,}
對齊規則
在coding中需要比較兩個結構體,比較其內部成員是否相同。
void
*memset
(void
*s,int c,
unsigned
long n)
;
int
memcmp
(const
void
*buf1,
const
void
*buf2, size_t count)
)//比較記憶體區域buf1和buf2的前count個位元組
//當buf1//當buf1=buf2時,返回值=0
//當buf1>buf2時,返回值》0
/*對於memcmp(),如果兩個字串相同而且count大於字串長度的話,memcmp不會在\0處停下來,會繼續比較\0後面的記憶體單元,直到_res不為零或者達到count次數。
如果想使用memcmp比較字串,要保證count不能超過最短字串的長度,否則結果有可能是錯誤的
*/
如果不能保證結構體用memset來初始化,那麼盡量不要用memcpy來直接比較兩個結構體,因為會存在位元組對齊的情況。
void
*memcpy
(void
*destin,
void
*source,
unsigned n)
typedef
struct params
params
typedef
}
#include
struct person
void
test()
;printf
("b off:%d\n"
,offsetof
(struct person, b));
//b off:4
printf
("d = %d\n",*
(int*)
(&p+
offsetof
(struct person, d)))
;//d = 100
}
從而上面的結構體成員比較可以寫成
if
(memcmp((
(char*)
.offset),(
(char*)
.offset)
,item[i]
.size)!=0
)
if
(memcmp((
(char*)
&(+item[i]
.offset),(
(char*)
.offset)
,item[i]
.size)!=0
)字,雙字,4字在自然邊界上不需要在記憶體中對齊。
為了訪問未對齊的記憶體,處理器需要做兩次記憶體的訪問,即需要額外的記憶體匯流排週期來訪問記憶體中未對齊的資料;然而,對齊的記憶體訪問僅需要一次訪問。
預設情況下,編譯器預設將結構、棧中的成員資料進行記憶體對齊。編譯器將未對齊的成員向後移,將每乙個成員都對齊到自然邊界上,從而也導致整個結構的尺寸變大。用犧牲控制項來換取效能。因此,sizeof(one_struct)時,得到是經過偏移後的占用記憶體的大小。
C語言之結構體
一 什麼是結構體 結構體是不同型別的資料組合成乙個有機整體。例如 學生的學號 姓名 性別 成績 位址 這些都是乙個學生的屬性,把這些屬性組織成乙個組合,組合中包含不同的資料型別,c和c 允許指定這樣的資料型別,稱為結構體。struct student 申明乙個結構體型別 struct是結構體申明的關...
C語言之結構體
在c語言中,可以使用結構體 struct 來存放一組不同型別的資料。結構體的定義形式為 struct 結構體名 結構體是一種集合,它裡面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每個這樣的變數或陣列都稱為結構體的成員 member 請看下面的乙個例子 struct stu stu 為結構...
C語言之結構體
在c語言中,有一種型別聽著很任性,叫做自定義型別。顧名思義,這種型別是程式設計師自己定義的一種型別,它和陣列很相似,但也有一些區別。自定義型別包含以下幾種 結構體 列舉 聯合 結構體就是將具有不同或相同的型別放在一起的聚合型別。可能聽著有些像順口溜,上一段 捋一捋。struct peo a 在 中我...