1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存

【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存

时间:2021-07-10 02:37:08

相关推荐

【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存

文章目录

一、结构体中嵌套一级指针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 < count; i++){tmp[i].address = (char *)malloc(20);}// 通过间接赋值 设置返回值*array = tmp;return ret;}

3、释放结构体内存 ( 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

释放结构体内存 :释放 结构体 内存时 , 要先释放 结构体变量 的 一级指针 成员的内存 , 然后再释放整个 结构体的 内存 ;

/*** @brief free_student 释放内存* @param array* @return*/int free_student(Student **array, int count){// 返回值int ret = 0;// 循环控制变量int i = 0;// 验证二级指针合法性if(array == NULL){ret = -1;return ret;}// 释放 每个结构体的 address 成员分配内存for(i = 0; i < count; i++){free((*array)[i].address);(*array)[i].address = NULL;}// 释放 结构体内存free(*array);// 指针置空 , 防止野指针*array = NULL;return ret;}

二、完整代码示例

#include <stdio.h>#include <stdlib.h>#include <string.h>/*** @brief The Student struct* 定义 结构体 数据类型 , 同时为该结构体类型声明 别名* 可以直接使用 别名 结构体变量名 声明结构体类型变量* 不需要在前面添加 struct 关键字*/typedef struct Student{// 声明变量时 , 会自动分配这 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 < count; i++){printf("Student age = %d\n", array[i].age);}}/*** @brief sort_struct_array 对结构体数组 按照年龄进行排序* @param array 结构体指针* @param count 结构体数组的元素个数*/void sort_struct_array(Student *array, int count){// 循环控制变量int i = 0, j = 0;// 学生年龄Student tmp;// 验证数组合法性if(array == NULL){return;}// 排序for(i = 0; i < count; i++){for(j = i + 1; j < count; j++){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 < count; i++){tmp[i].address = (char *)malloc(20);}// 通过间接赋值 设置返回值*array = tmp;return ret;}/*** @brief free_student 释放内存* @param array* @return*/int free_student(Student **array, int count){// 返回值int ret = 0;// 循环控制变量int i = 0;// 验证二级指针合法性if(array == NULL){ret = -1;return ret;}// 释放 每个结构体的 address 成员分配内存for(i = 0; i < count; i++){free((*array)[i].address);(*array)[i].address = NULL;}// 释放 结构体内存free(*array);// 指针置空 , 防止野指针*array = NULL;return ret;}/*** @brief 主函数入口* @return*/int main(int argc, char* argv[], char**env){// 声明结构体数组 , 该数组在栈内存中Student *array = NULL;// 循环控制变量int i = 0;// 堆内存中为结构体指针分配内存create_student(&array, 2);// 命令行中 , 接收输入的年龄for(i = 0; i < 2; i++){// 命令换行中 接收 输入的年龄 ,// 设置到 Student 数组元素的 age 成员中printf("\n Input Age :\n");scanf("%d", &(array[i].age));printf("\n Input ID :\n");scanf("%d", &(array[i].id));printf("\n Input Name :\n");scanf("%s", array[i].name);printf("\n Input Address :\n");scanf("%s", array[i].address);}// 结构体数组 按照 age 排序sort_struct_array(array, 2);// 打印结构体数组中的 结构体 age 字段printf_struct_array(array, 2);// 释放堆内存数据free_student(&array, 2);// 命令行不要退出system("pause");return 0;}

执行结果 :

Input Age :21Input ID :1Input Name :TomInput Address :ChinaInput Age :18Input ID :2Input Name :JerryInput Address :RussiaStudent age = 18Student age = 21请按任意键继续. . .

【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。