C語言結(jié)構(gòu)體嵌套與對齊超詳細(xì)講解
嵌套結(jié)構(gòu)體
格式:
typedef struct 結(jié)構(gòu)體名 {
struct 結(jié)構(gòu)體名1 結(jié)構(gòu)體變量名1;
struct 結(jié)構(gòu)體名2 *結(jié)構(gòu)體指針變量名1;
}結(jié)構(gòu)體別名_t;
定義結(jié)構(gòu)體普通的變量,訪問結(jié)構(gòu)體中的成員:
結(jié)構(gòu)體別名_t 普通結(jié)構(gòu)體變量名;
普通結(jié)構(gòu)體變量名.結(jié)構(gòu)體變量名1.成員名;
普通結(jié)構(gòu)體變量名.結(jié)構(gòu)體指針變量名1->成員名;
定義結(jié)構(gòu)體指針變量,訪問結(jié)構(gòu)體中的成員
結(jié)構(gòu)體別名_t *結(jié)構(gòu)體指針變量名;
結(jié)構(gòu)體指針變量名->結(jié)構(gòu)體變量名1.成員名;
結(jié)構(gòu)體指針變量名->結(jié)構(gòu)體指針變量名1->成員名;
總結(jié),訪問結(jié)構(gòu)體中的成員時,具體使用.還是->,需要看當(dāng)前的結(jié)構(gòu)體變量的類型。
測試用例:
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct Person { char *name; int age; char sex; } Person_t; typedef struct Student { Person_t per; int score; } Student_t; typedef struct Teacher { Person_t *per_p; int salary; } Teacher_t; int main(int argc, const char *argv[]) { /*your code*/ // 1. 定義結(jié)構(gòu)體類型的變量 Student_t stu1; // 2. 初始化結(jié)構(gòu)體中的成員 stu1.per.name = (char *)malloc(sizeof(char) * 20); if (stu1.per.name == NULL) { printf("malloc failed\n"); return -1; } strcpy(stu1.per.name, "zhoukai"); stu1.per.age = 18; stu1.per.sex = 'M'; stu1.score = 99; printf("姓名:%s 年齡:%d 性別:%c 工資:%d\n",\ stu1.per.name, stu1.per.age, stu1.per.sex, stu1.score); // 使用Teacher_t定義結(jié)構(gòu)體指針類型的變量,使用malloc分配空間 Teacher_t *t=(Teacher_t *)malloc(sizeof(Teacher_t)); if(NULL==t)printf("malloc memory filed!\n"); // 對Teacher_t類型中的per_p成員,使用malloc分配空間, t->per_p =(Person_t *)malloc(sizeof(Person_t)); if(NULL==t->per_p) { printf("malloc memory filed!\n"); return -1; } // 對Person_t中的name成員,使用malloc分配空間。 t->per_p->name=(char *)malloc(sizeof(char)*20); if(NULL==t->per_p->name) { printf("malloc memory filed!\n"); return -1; } // 分配堆區(qū)空間時,從外向內(nèi)進(jìn)行分配;釋放空間時,從內(nèi)向外分配空間。 strcpy(t->per_p->name,"yao"); t->per_p->age=10; t->per_p->sex='M'; t->salary=100000; printf("姓名:%s 年齡:%d 性別:%c 工資:%d\n",\ t->per_p->name,t->per_p->age, t->per_p->sex,t->salary); //釋放空間 free(t->per_p->name); t->per_p->name=NULL; free(t->per_p); t->per_p=NULL; free(t); t=NULL; return 0; }
圖解:
結(jié)構(gòu)體內(nèi)存對齊
32位的操作系統(tǒng)
結(jié)構(gòu)體中成員內(nèi)存對齊,只考慮基本的數(shù)據(jù)類型,不考慮構(gòu)造類型,構(gòu)造類型最終也是由基本類型構(gòu)成。
1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員最大的成員只占4/8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍;
結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,long int, long long int, float, double 類型,
此成員的地址是4的整數(shù)倍;
編譯成32位的可執(zhí)行程序:
gcc ***.c -m32
測試:
#include <stdio.h> #include <string.h> #include <stdlib.h> //1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍; typedef struct{ char name[20]; char sex; char age; }A_t; //2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍; typedef struct{ char name[20]; short age; char sex; // 保留一個字節(jié) }B_t; typedef struct{ char name[20]; char sex; // 保留一個字節(jié) short age; }C_t; //3> 如果結(jié)構(gòu)體中的成員最大的成員只占4/8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍; typedef struct{ char name[20]; char sex; // 保留三個字節(jié) int age; }D_t; typedef struct{ char name[20]; char sex; // 保留一個字節(jié) short score; int age; }E_t; typedef struct{ char name[20]; char sex; // 保留一個字節(jié) short score; long long int age; }F_t; typedef struct{ char *name; char sex; // 保留一個字節(jié) short score; long long int age; }G_t; typedef struct{ char *name; char sex; // 保留一個字節(jié)(不同類型的在同一行,不同的那個從后往前補!?。? short score; char salary; long long int age; }H_t; int main(int argc, const char *argv[]) { /*your code*/ printf("A_t type size=%d\n",sizeof(A_t));//22 printf("B_t type size=%d\n",sizeof(B_t));//24 printf("C_t type size=%d\n",sizeof(C_t));//24 printf("D_t type size=%d\n",sizeof(D_t));//28 printf("E_t type size=%d\n",sizeof(E_t));//28 printf("F_t type size=%d\n",sizeof(F_t));//32 printf("G_t type size=%d\n",sizeof(G_t));//16 printf("H_t type size=%d\n",sizeof(H_t));//20 printf("-----------G_t中成員的地址-----------\n"); G_t g; printf("G_t成員 char *name 的地址%p\n",g.name); printf("G_t成員 char sex 的地址%p\n",&g.sex); printf("G_t成員 short score 的地址%p\n",&g.score); printf("G_t成員 long long int age 的地址%p\n",&g.age); printf("-----------H_t中成員的地址-----------\n"); H_t h; printf("H_t成員 char *name 的地址%p\n",h.name); printf("H_t成員 char sex 的地址%p\n",&h.sex); printf("H_t成員 short score 的地址%p\n",&h.score); printf("H_t成員 char salary 的地址%p\n",&h.salary); printf("H_t成員 long long int age 的地址%p\n",&h.age); return 0; }
64位的操作系統(tǒng)
結(jié)構(gòu)體中成員內(nèi)存對齊,只考慮基本的數(shù)據(jù)類型,不考慮構(gòu)造類型,構(gòu)造類型最終也是由基本類型構(gòu)成。
1> 如果結(jié)構(gòu)體中的成員最大的成員只占1個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員最大的成員只占2個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員最大的成員只占4個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員最大的成員只占8個字節(jié)的空間,則結(jié)構(gòu)體類型的大小為8的整數(shù)倍;
結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,float類型,
此成員的地址是4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員為long int, long long int, double 類型,
此成員的地址是8的整數(shù)倍;
編譯成64位的可執(zhí)行程序:
8的整數(shù)倍;
結(jié)構(gòu)體中的成員的地址:
1> 如果結(jié)構(gòu)體中的成員為char類型,此成員的地址是1的整數(shù)倍;
2> 如果結(jié)構(gòu)體中的成員為short類型,此成員的地址是2的整數(shù)倍;
3> 如果結(jié)構(gòu)體中的成員為int,float類型,
此成員的地址是4的整數(shù)倍;
4> 如果結(jié)構(gòu)體中的成員為long int, long long int, double 類型,
此成員的地址是8的整數(shù)倍;
編譯成64位的可執(zhí)行程序:
gcc ***.c
到此這篇關(guān)于C語言結(jié)構(gòu)體嵌套與對齊超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C語言結(jié)構(gòu)體嵌套內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++普通函數(shù)指針與成員函數(shù)指針實例解析
這篇文章主要介紹了C++普通函數(shù)指針與成員函數(shù)指針,很重要的知識點,需要的朋友可以參考下2014-08-08C/C++?Qt數(shù)據(jù)庫SqlRelationalTable關(guān)聯(lián)表詳解
這篇文章主要介紹了QT中SqlRelationalTable關(guān)聯(lián)表組件的使用,文中代碼對我們的學(xué)習(xí)和工作具有一定價值,感興趣的朋友可以了解一下2021-12-12c++11多種格式時間轉(zhuǎn)化為字符串的方法實現(xiàn)
本文主要介紹了c++11多種格式時間轉(zhuǎn)化為字符串的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11解析c中stdout與stderr容易忽視的一些細(xì)節(jié)
本篇文章是對在c語言中stdout與stderr容易忽視的一些細(xì)節(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05