C-C++语言结构体中定义另一个结构体指针的经验

本文进行讨论的是,在Linux中,C/C++语言的结构体的使用情况。一般情况下,结构体的使用还是相对比较简单的,它携带的一类物体的某一些属性,

比如

[cpp]  view plain  copy
  1. struct person  
  2. {  
  3.    int age;  
  4.    int height;  
  5.   //...    
  6. };  

这个结构一携带的就是一个人的两个基本信息,年龄(age)和身高(height),同样你也可以继续添加人的相关信息进去,比如学号,班级等。

但是今天讨论的是在结构体中定义一个结构体指针的问题,当然这也可以延伸到结构体定义一个普通类型的指针方面,读者可以自行进行验证或者思考,本文

不作讨论。

[cpp]  view plain  copy
  1. typedef struct tagStudent_T  
  2. {  
  3.     int i_StuID;  
  4.     int i_StuClass;  
  5. }Student_T;  
  6.   
  7. typedef struct tagSchool_T  
  8. {  
  9.     Student_T *student;  
  10.     int i_SchoolRank;  
  11. }School_T;  

上述的两个结构体表示的含义是:

第一个: 学生的个人信息

第二个:学校的情况(包含了学生的信息和学校的排名)

接下来,如果要对Statuend_T的结构体的变量进行设置,那么有两种方法,第一个直接使用Student_T定义的变量进行赋值,第二个就是使用School_T进行间接赋值,

今天就是讨论第二种的方法。

首先,在一个程序运行过程中,实际上是内存指针在操作,因此我们定义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等没有进行测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值