C/C++語言結構體中定義另外一個結構體指針的經驗

本文進行討論的是,在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等沒有進行測試)

相關文章
相關標籤/搜索