結構體一般情況下在函式外部定義,例如定義乙個學生管理系統的結構體,可以在包含標頭檔案之後寫如下內容:
struct student ;
需要注意的是在定義語句的末尾即"}"後面要記得加上「;」,因為很多看起來類似的c語言語句比如if語句,for迴圈等等後面都是沒有的,因此容易忘記。
定義之後,在函式中使用之前需要進行初始化,初始化的方法有如下幾種: 1、
struct student stu = ;
2、stu.num = 2;
strcpy(stu.name,"zhangsan");(用指標也可以)
結構體指標:
定義結構體指標:
struct student *p_stu = &stu;
用結構體指標賦值:
p_stu->num = 2;
strcpy(p_stu->name,"zhangsan");
其他語句賦值類似。
需要注意的是結構體在記憶體中需要記憶體對齊,比如:
struct node ;
在記憶體中儲存時,以gcc為例,它會預設找到結構體中位元組長度最大資料型別的位元組長度為分配記憶體的單位,但是在gcc中最大支援4位元組對齊,即最大以4位元組為單位,所以在上面的結構體中雖然long最大,但是因為位元組長度超過4位元組所以預設以int的位元組長度即4位元組為記憶體分配單位。
首先第乙個元素分配4位元組,int正好全部用完,遇到short,依然分配4個位元組,但是short為2個位元組,沒用完,繼續往下走,遇到char,char為1個位元組,上面short用完2個位元組後還剩2個位元組,正好可以儲存char,因此不用再分配位元組,現在遇到short時分配的4位元組還剩下1個,繼續往下走,遇到long,long為8位元組,1個位元組明顯不夠用,但是記憶體對齊不會讓long使用這1個位元組,而是重新分配4個位元組,還是不夠用,繼續分配4個位元組,因此該結構體位元組長度為16。
以上只是在預設情況下,而應用中修改預設分配的位元組長度,在gcc中一共支援1、2、4三種情況,以修改為1個位元組為例,方法如下:
#pragma pack(1)
(結構體)......
#pragma pack ()
雖然規則如此,但是筆者也遇到過特殊情況:
struct node ;
按照原本的邏輯,該結構體預設情況下位元組長度應為8,但是實際情況卻為12,具體原因我也不清楚,有待大家去解答。
2023年11月12日學習總結
今日彙總 gdb偵錯程式 除錯命令 例 gcc g test.c o test 開啟 gdb tes其中tes為可執行檔案 指令 run執行程式 list 行數 顯示 至指定行數 break 行數 執行到指定行數 next 單步執行 print 變數名 顯示指定變數在當前步驟的值 continue ...
2023年12月20日感想
剛才正在學習,突然之間有點感觸,很多做技術的都想著自己哪天成為大牛,我自己也總是這樣幻想,可是就在剛才自己突然想問自己,自己的努力有能讓自己成為大牛的可能麼?自己的回答是沒有,很多人的努力只是淺嘗輒止 這句話並沒有錯,適合很多人,也同樣適合我,大牛沒有突然之間形成的,都是靠技術一點一點累計而成的,當...
2023年11月2日學習總結
繼續按照計畫複習c語言的迴圈結構,同分支結構一樣,難度不大,理解起來也很容易。晚上第一節嵌入式課程開始,並沒有立刻講什麼深奧的專業知識,而是系統地了解了嵌入式的概念。簡單來說嵌入式開發與傳統的微控制器開發的的最明顯的乙個區別就在於作業系統。嵌入式開發可通過在作業系統上開發應用軟體來控制硬體,而不需要...