結構體大小的獲取 :
- 我們使用sizeof()函數來獲取結構體的大小
#include
struct test1
{
int a; // 0 1 2 3
char b; // 4
float c; // 8 9 10 11
};
struct test2
{
int a; // 0 1 2 3
char b; // 4
char d; // 5
char e; // 6
float c; // 8 9 10 11
};
int main()
{
struct test1 t1;
struct test2 t2;
int s1=sizeof(t1);
int s2=sizeof(t2);
printf("s1=%d,s2=%d",s1,s2);
return 0;
}
輸出結果:
s1=12,s2=12
- 從上面的例子我們可以看到,t1,t2
兩個結構體的內部的成員變量構成明明不一樣,但是最終結構體的大小卻是相同的,都是12字節。 - 這就是因為結構體內存對齊的原因,使得構成并不相同的兩個結構體在大小上卻是相同的。
- 其中t2中成員變量d,e占據的內存,是在結構體內存對齊后補齊的空位,因此結構體整體的大小并沒有增加。
- 正是因為結構體存在內存對齊,所以無法對結構體進行比較高效的直接比較,也就是無法對兩個結構體整體進行比較。
- 那么為了比較結構體,我們就想到了對結構體內部成員變量的比較。
結構體的比較
既然要對結構體的成員變量進行比較,那么我們就要先能夠獲取成員變量。
// 獲取方法
變量名.成員變量名
// 對于t1,我們如果想要獲取t1的內部成員變量a,那么我們就可以這樣寫:
t1.a
#include
struct test1
{
int a;
char b;
float c;
};
// 那么當我們判斷兩個test1類型的結構體t1,t2是否相等時,就可以這么寫
int isEqual(test1 x,test1 y)
{
if(x.a==y.a && x.b==y.b && x.c==y.c)
{
return 1; // 相等返回 1
}
else return 0; // 不相等返回 0
}
int main()
{
struct test1 t1={1,'a',2.1}; // 聲明兩個test1類型的結構體變量
struct test1 t2={1,'a',2.1};
int r=isEqual(t1,t2); // 調用函數進行比較
printf("%d",r);
return 0;
}
輸出結果:
1
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
內存
+關注
關注
8文章
3037瀏覽量
74143 -
函數
+關注
關注
3文章
4338瀏覽量
62743 -
變量
+關注
關注
0文章
613瀏覽量
28408 -
sizeof
+關注
關注
0文章
9瀏覽量
6439 -
結構體
+關注
關注
1文章
130瀏覽量
10856
發布評論請先 登錄
相關推薦
【武漢華嵌】結構體的sizeof問題
和編譯器有關。就一般情況而言,主要有以下三個原則:1) 結構體變量的首地址能夠被其最寬基本類型成員的大小所整除;2) 結構體每個成員相對于
發表于 03-22 16:26
labview調用dll獲取硬件信息結構體求教
想調用winmm.dll中的waveOutGetDevCaps獲取聲卡信息,但是里面有結構體數據,嘗試了幾次都失敗告終,求大蝦指教。MMRESULT waveOutGetDevCaps
發表于 01-14 10:20
關于labview傳入參數到DLL結構體
labview給DLL中結構體傳入參數,要保證字節對齊下面是注意事項,很關鍵:labview中層次結構數據類型(例如,簇)中的數組和字符串始終包括大小信息。所以簇內存中包含字符串的
發表于 11-08 20:30
C語言中創建一個結構體其實際占用的內存空間大小是多少呢?
際占用的內存空間大小是多少呢?示例代碼如下:struct S{int i;char c;int j;};要正確計算結構體大小,首先需要了解數據對齊的原理。數據對齊
發表于 09-29 11:57
經典 C 語言編程,結構體和聯合體如何共用?
中可以 使用 sizeof 進行獲取,默認為字節對齊的大小。 聯合體 聯合體的參數共享同一個內存地址,所占的內存大小完全是由聯合體中參數類型決定字長,然后數據共享,內存共享等。 結構
評論