本文進行討論的是,在Linux中,C/C++語言的結構體的使用狀況。通常狀況下,結構體的使用仍是相對比較簡單的,它攜帶的一類物體的某一些屬性,測試
好比spa
struct person { int age; int height; //... };
這個結構一攜帶的就是一我的的兩個基本信息,年齡(age)和身高(height),一樣你也能夠繼續添加人的相關信息進去,好比學號,班級等。指針
可是今天討論的是在結構體中定義一個結構體指針的問題,固然這也能夠延伸到結構體定義一個普通類型的指針方面,讀者能夠自行進行驗證或者思考,本文code
不做討論。blog
typedef struct tagStudent_T { int i_StuID; int i_StuClass; }Student_T; typedef struct tagSchool_T { Student_T *student; int i_SchoolRank; }School_T;
上述的兩個結構體表示的含義是:內存
第一個: 學生的我的信息string
第二個:學校的狀況(包含了學生的信息和學校的排名)io
接下來,若是要對Statuend_T的結構體的變量進行設置,那麼有兩種方法,第一個直接使用Student_T定義的變量進行賦值,第二個就是使用School_T進行間接賦值,編譯
今天就是討論第二種的方法。class
首先,在一個程序運行過程當中,其實是內存指針在操做,所以咱們定義School_T的指針*school,具體的操做以下程序
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> typedef struct tagStudent_T { int i_StuID; int i_StuClass; }Student_T; typedef struct tagSchool_T { Student_T *student; int i_SchoolRank; }School_T; int main(int argc,char const *argv[]) { School_T *school = (School_T *)malloc(sizeof(School_T)); if(NULL != school) { school->i_SchoolRank = 1; //rank first /*因爲School_T中定義的student是一個結構體指針,必需要對其進行分配內存*/ school->student = (Student_T *)malloc(sizeof(Student_T)); if(NULL != school->student) { school->student->i_StuID = 12345; school->student->i_StuClass = 5; } else { free(school); } } /*這兩個的free順序最好不要調轉,由於若是先free掉school的話,至關於將student得本體free了,至關於一個野指針 */ free(school->student); free(school); }
若是你不想使用這種方式,大可直接使用變量,不是指針類的變量,如School_T school。一樣School_T結構體重使用的也是一個普通的變量,即Student_T student,這樣,
你就不須要進行內存指針的操做。可是本人建議仍是使用指針來進行,效率相對而言會更快一點。能夠參考一些<C和指針>這本書
(注:上述的編譯只在Ubuntu下的Linux系統操做,其餘的win,vs等沒有進行測試)