【C 语言】结构体 ( 结构体中嵌套一级指针 您所在的位置:网站首页 struct分配空间 【C 语言】结构体 ( 结构体中嵌套一级指针

【C 语言】结构体 ( 结构体中嵌套一级指针

2024-01-31 00:06| 来源: 网络整理| 查看: 265

文章目录 一、结构体中嵌套一级指针1、声明 结构体类型2、为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 )3、释放结构体内存 ( 释放内存时先释放 指针成员内存 然后再释放结构头内存 ) 二、完整代码示例

一、结构体中嵌套一级指针 1、声明 结构体类型

声明 结构体类型 : 这里注意 , 在结构体中 , 定义一个 一级指针 变量 , 注意与 数组类型区别 ;

结构体内定义数组 , 声明变量时 , 会自动分配数组内存 ;结构体内定义指针 , 声明变量时 , 只会为 4 字节指针分配内存 ; /** * @brief The Student struct * 定义 结构体 数据类型 , 同时为该结构体类型声明 别名 * 可以直接使用 别名 结构体变量名 声明结构体类型变量 * 不需要在前面添加 struct 关键字 */ typedef struct Student { // 声明变量时 , 会自动分配这 5 字节内存 // 赋值时 , 可以直接使用 = 赋值字符串 char name[5]; int age; int id; // 声明变量时 , 只会为 4 字节指针分配内存 // 具体的 字符串内存 需要额外使用 malloc 申请内存 // 赋值时 , 必须使用 strcpy 函数 , 向堆内存赋值 char *address; }Student; 2、为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 )

为 结构体 变量分配内存 : 结构体 内存分配完成之后 , 需要立刻为 结构体的 一级指针 成员分配内存 ;

/** * @brief create_student 堆内存中分配内存 * @param array 二级指针 , 指向结构体数组 * @return */ int create_student(Student **array, int count) { // 返回值 int ret = 0; // 循环控制变量 int i = 0; // 临时变量 Student *tmp = NULL; // 验证二级指针合法性 if(array == NULL) { ret = -1; return ret; } // 堆内存中申请内存 tmp = (Student *)malloc(sizeof(Student) * count); // 初始化分配的内存 memset(tmp, 0, sizeof(Student) * count); // 为每个结构体的 address 成员分配内存 for(i = 0; i // 返回值 int ret = 0; // 循环控制变量 int i = 0; // 验证二级指针合法性 if(array == NULL) { ret = -1; return ret; } // 释放 每个结构体的 address 成员分配内存 for(i = 0; i // 声明变量时 , 会自动分配这 5 字节内存 // 赋值时 , 可以直接使用 = 赋值字符串 char name[5]; int age; int id; // 声明变量时 , 只会为 4 字节指针分配内存 // 具体的 字符串内存 需要额外使用 malloc 申请内存 // 赋值时 , 必须使用 strcpy 函数 , 向堆内存赋值 char *address; }Student; /** * @brief printf_struct_array 打印结构体数组 * @param array 数组作为函数参数退化为指针 * @param count 数组中的元素个数 */ void printf_struct_array(Student *array, int count) { // 循环控制变量 int i = 0; // 验证数组合法性 if(array == NULL) { return; } // 打印结构体数组中的 结构体 age 字段 for(i = 0; i // 循环控制变量 int i = 0, j = 0; // 学生年龄 Student tmp; // 验证数组合法性 if(array == NULL) { return; } // 排序 for(i = 0; i if(array[i].age > array[j].age) { tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } } } /** * @brief create_student 堆内存中分配内存 * @param array 二级指针 , 指向结构体数组 * @return */ int create_student(Student **array, int count) { // 返回值 int ret = 0; // 循环控制变量 int i = 0; // 临时变量 Student *tmp = NULL; // 验证二级指针合法性 if(array == NULL) { ret = -1; return ret; } // 堆内存中申请内存 tmp = (Student *)malloc(sizeof(Student) * count); // 初始化分配的内存 memset(tmp, 0, sizeof(Student) * count); // 为每个结构体的 address 成员分配内存 for(i = 0; i // 返回值 int ret = 0; // 循环控制变量 int i = 0; // 验证二级指针合法性 if(array == NULL) { ret = -1; return ret; } // 释放 每个结构体的 address 成员分配内存 for(i = 0; i // 声明结构体数组 , 该数组在栈内存中 Student *array = NULL; // 循环控制变量 int i = 0; // 堆内存中为结构体指针分配内存 create_student(&array, 2); // 命令行中 , 接收输入的年龄 for(i = 0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有