美文网首页
结构体嵌套二级指针

结构体嵌套二级指针

作者: 76577fe9b28b | 来源:发表于2017-03-02 14:41 被阅读207次
要求:老师人数不限,老师有id,姓名,学生人数,学生姓名。

结构体定义

#define  NAME_MAX 40  //定义name创建内存大小
typedef struct{
    int id;    //老师id
    char *name;  //老师名字
    int stu_num;  //学生人数
    char **stu_name;  //学生姓名
} Teacher;

数组名指向数组首元素地址

  • 功能:开辟num个老师内存地址
 /*
     *teacher:指向老师数组的指针的
      num:开辟老师内存个数
*/
 int zcalloc_struct(Teacher **teacher, int num){
    
    if (teacher == NULL || num <= 0) {
        return  -1;
    }
    
    Teacher *teacher_in = NULL;
    
    teacher_in = calloc(num, sizeof(Teacher));
    
    for (int i = 0; i < num; i++) {
       
        (teacher_in + i)->name = malloc(sizeof(char) * NAME_MAX);
        memset((teacher_in + i)->name, 0, sizeof(char) * NAME_MAX);
    }
    
    *teacher = teacher_in;
    return 0;
}
  • 创建学生姓名数组
//stu_num:学生人数
int create_two_point_struct(Teacher **teacher, int stu_num){
    
    char * *stu_name = malloc(sizeof(char *) * stu_num);
    
    for (int i = 0; i < stu_num; i++) {
        //*(stu_name + i): 向stu_name + i指向的地址存放值 
        *(stu_name + i) = calloc(NAME_MAX, sizeof(char));
    }
   
    (*teacher)->stu_name = stu_name;
    return  0;
}
  • 打印数据
void print_struct(Teacher *teacher, int num){
  
    for (int i = 0; i < num; i++) {
        
        Teacher *tea = teacher + i;
        
        printf("id:%d,姓名:%s,学生人数:%d\n", tea->id,tea->name, tea->stu_num);
        
        for (int j = 0; j < tea->stu_num ; j++) {
            
            printf("%s\n", *(tea->stu_name + j));
        }   
    }
}
  • 释放内存
int static free_struct(Teacher **teacher , int num){

    if (teacher == NULL) {
        
        return -1;
    }
    
    for (int i = 0; i < num; i++) {
        
        Teacher *tea = *teacher + i;
       
        if (tea != NULL && tea->name != NULL) {
            
            free(tea->name);
            if (tea->stu_name != NULL) {
                
                for (int j = 0; j < tea->stu_num; j++) {
                  // *(tea->stu_name + j)  :取出tea->stu_name + j指向地址的值
                    char *ch = *(tea->stu_name + j);
                    if (ch != NULL) {
                        free(ch);
                    }
                }
                free(tea->stu_name);
            }
        }
    }

    free(*teacher);
    *teacher = NULL;
    return 0;
}

  • 测试
void struct_two_point(){
    
    Teacher *teacher = NULL;
    int num = 0;
    printf("请输入老师人数:");
    scanf("%d", &num);
    
    zcalloc_struct(&teacher,num);
    for (int i = 0; i < num; i++) {
        
        Teacher *tea = (teacher + i);
        
        printf("请输入老师Id:");
        scanf("%d",&(tea->id)) ;
        printf("请输入老师名字:");
        scanf("%s",tea->name) ;
        printf("请输入老师学生人数:");
        scanf("%d",&tea->stu_num);
        
        create_two_point_struct(&tea, tea->stu_num);
        for (int j = 0; j < tea->stu_num; j++) {
            
            scanf("%s",*(tea->stu_name + j));
        }
    }
    
    print_struct(teacher, num);
    free_struct(&teacher, num);
}

相关文章

  • 结构体的基本操作

    结构体定义和初始化 结构体变量相互赋值 结构体数组 结构体嵌套一级指针 结构体嵌套二级指针 结构体偏移量 联合体 ...

  • 结构体嵌套二级指针

    在结构体中嵌套二级指针 如上的结构体 ,首先打算弄个Techears类数组 然后..这样就可以存储多个老师了 代码...

  • 结构体嵌套二级指针

    要求:老师人数不限,老师有id,姓名,学生人数,学生姓名。 结构体定义 数组名指向数组首元素地址 功能:开辟num...

  • 结构体

    结构体初识 结构体指针 结构体的匿名字段 结构体嵌套 Go语言中的OOP

  • protoc-生成go指针

    protoc-生成go指针 这里指的是为结构体中基础类型生成go指针,嵌套结构体默认就是指针 为什么需要生成指针?...

  • 【Golang】json自定义序列化的深入解析

    对于使用结构体中嵌套结构体的情况,只有receiver为指针类型,而嵌套结构体为结构体的值语义的时候不能触发自定义...

  • JNI总结

    java调用c/c++ 在C中:JNIEnv 结构体指针别名env二级指针 在C++中:JNIEnv 是一个结构体...

  • 结构体中套二级指针

    问题模型 利用结构体中套二级指针 创建内存的方式

  • 结构体嵌套

    结构体嵌套 结构体嵌套时应逐级引用

  • C语言20 结构体指针

    C语言20 结构体指针 探测结构体指针的特性 ++、-- 加法与减法 指针相减 使用结构体指针 结构体指针一定要指...

网友评论

      本文标题:结构体嵌套二级指针

      本文链接:https://www.haomeiwen.com/subject/pxnhgttx.html