【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )
生活随笔
收集整理的這篇文章主要介紹了
【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、結構體中嵌套二級指針
- 1、結構體中嵌套二級指針 類型聲明
- 2、為 結構體內的二級指針成員 分配內存
- 3、釋放 結構體內的二級指針成員 內存
- 二、完整代碼示例
一、結構體中嵌套二級指針
1、結構體中嵌套二級指針 類型聲明
結構體中 嵌套 二級指針 , 二級指針 可以使用 指針數組 / 二維數組 / 自定義二級指針內存 三種內存模型的任意一種 ;
此處選擇的模型是 自定義二級指針內存 ;
代碼示例 :
/*** @brief The Student struct* 定義 結構體 數據類型 , 同時為該結構體類型聲明 別名* 可以直接使用 別名 結構體變量名 聲明結構體類型變量* 不需要在前面添加 struct 關鍵字*/ typedef struct Student {// 聲明變量時 , 會自動分配這 5 字節內存// 賦值時 , 可以直接使用 = 賦值字符串char name[5];int age;int id;// 聲明變量時 , 只會為 4 字節指針分配內存// 具體的 字符串內存 需要額外使用 malloc 申請內存// 賦值時 , 必須使用 strcpy 函數 , 向堆內存賦值char *address;// 學生小組成員 , 由多個字符串組成// 二級指針 , 指向多個 一級指針// 每個 一級指針 指向 一個字符串// 此處的 二級指針 可以使用 指針數組 / 二維數組 / 自定義二級指針內存// 此處選擇的模型是 自定義二級指針內存char **team; }Student;2、為 結構體內的二級指針成員 分配內存
為二級指針成員分配內存時 , 先為二級指針分配內存 , 再為一級指針分配內存 ;
核心業務邏輯 :
// 為每個結構體的 address 成員分配內存for(i = 0; i < count; i++){// 為一級指針分配內存模型tmp[i].address = (char *)malloc(20);// 為 二級指針 內存模型分配內存 , 分配 3 個 一級指針 變量內存char **p = (char **)malloc(3 * sizeof(char *));// 為 二級指針 指向的 一級指針 分配內存for(j = 0; j < 3; j++){// 每個一級指針分配 10 字節數據p[j] = (char *)malloc(10 * sizeof(char));}// 將分配好內存的 二級指針 模型 , 賦值給結構體中的二級指針tmp[i].team = p;}代碼示例 :
/*** @brief create_student 堆內存中分配內存* 為二級指針成員分配內存時 , 先為二級指針分配內存 , 再為一級指針分配內存* @param array 二級指針 , 指向結構體數組* @return*/ int create_student(Student **array, int count) {// 返回值int ret = 0;// 循環控制變量int i = 0, j = 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);// 為 二級指針 內存模型分配內存 , 分配 3 個 一級指針 變量內存char **p = (char **)malloc(3 * sizeof(char *));// 為 二級指針 指向的 一級指針 分配內存for(j = 0; j < 3; j++){// 每個一級指針分配 10 字節數據p[j] = (char *)malloc(10 * sizeof(char));}// 將分配好內存的 二級指針 模型 , 賦值給結構體中的二級指針tmp[i].team = p;}// 通過間接賦值 設置返回值*array = tmp;return ret; }3、釋放 結構體內的二級指針成員 內存
釋放內存時 , 先釋放 二級指針 指向的 一級指針 的內存 , 再釋放 二級指針 內存 ;
核心業務邏輯 :
// 釋放 每個結構體的 address 成員分配內存for(i = 0; i < count; i++){// 釋放一級指針free((*array)[i].address);(*array)[i].address = NULL;// 釋放二級指針指向的一級指針for(j = 0; j < 3; j++){if((*array)[i].team[j] != NULL){free( (*array)[i].team[j] );(*array)[i].team[j] = NULL;}}// 釋放二級指針if((*array)[i].team != NULL){free( (*array)[i].team );(*array)[i].team = NULL;}}代碼示例 :
/*** @brief free_student 釋放內存* 釋放內存時 , 先釋放 二級指針 指向的 一級指針 的內存 , 再釋放 二級指針 內存* @param array* @return*/ int free_student(Student **array, int count) {// 返回值int ret = 0;// 循環控制變量int i = 0, j = 0;// 驗證二級指針合法性if(array == NULL){ret = -1;return ret;}// 釋放 每個結構體的 address 成員分配內存for(i = 0; i < count; i++){// 釋放一級指針free((*array)[i].address);(*array)[i].address = NULL;// 釋放二級指針指向的一級指針for(j = 0; j < 3; j++){if((*array)[i].team[j] != NULL){free( (*array)[i].team[j] );(*array)[i].team[j] = NULL;}}// 釋放二級指針if((*array)[i].team != NULL){free( (*array)[i].team );(*array)[i].team = 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;// 學生小組成員 , 由多個字符串組成// 二級指針 , 指向多個 一級指針// 每個 一級指針 指向 一個字符串// 此處的 二級指針 可以使用 指針數組 / 二維數組 / 自定義二級指針內存// 此處選擇的模型是 自定義二級指針內存char **team; }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, j = 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);// 為 二級指針 內存模型分配內存 , 分配 3 個 一級指針 變量內存char **p = (char **)malloc(3 * sizeof(char *));// 為 二級指針 指向的 一級指針 分配內存for(j = 0; j < 3; j++){// 每個一級指針分配 10 字節數據p[j] = (char *)malloc(10 * sizeof(char));}// 將分配好內存的 二級指針 模型 , 賦值給結構體中的二級指針tmp[i].team = p;}// 通過間接賦值 設置返回值*array = tmp;return ret; }/*** @brief free_student 釋放內存* 釋放內存時 , 先釋放 二級指針 指向的 一級指針 的內存 , 再釋放 二級指針 內存* @param array* @return*/ int free_student(Student **array, int count) {// 返回值int ret = 0;// 循環控制變量int i = 0, j = 0;// 驗證二級指針合法性if(array == NULL){ret = -1;return ret;}// 釋放 每個結構體的 address 成員分配內存for(i = 0; i < count; i++){// 釋放一級指針free((*array)[i].address);(*array)[i].address = NULL;// 釋放二級指針指向的一級指針for(j = 0; j < 3; j++){if((*array)[i].team[j] != NULL){free( (*array)[i].team[j] );(*array)[i].team[j] = NULL;}}// 釋放二級指針if((*array)[i].team != NULL){free( (*array)[i].team );(*array)[i].team = 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);printf("\n Input Team 1 Name :\n");scanf("%s", array[i].team[0]);printf("\n Input Team 2 Name :\n");scanf("%s", array[i].team[1]);printf("\n Input Team 3 Name :\n");scanf("%s", array[i].team[2]);}// 結構體數組 按照 age 排序sort_struct_array(array, 2);// 打印結構體數組中的 結構體 age 字段printf_struct_array(array, 2);// 釋放堆內存數據free_student(&array, 2);// 命令行不要退出system("pause");return 0; }執行結果 :
Input Age : 18Input ID : 1Input Name : TomInput Address : CHinaInput Team 1 Name : Tom1Input Team 2 Name : Tom2Input Team 3 Name : Tom3Input Age : 16Input ID : 2Input Name : JerryInput Address : BeijingInput Team 1 Name : Jerry1Input Team 2 Name : Jerry2Input Team 3 Name : Jerry3 Student age = 16 Student age = 18 請按任意鍵繼續. . .總結
以上是生活随笔為你收集整理的【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C 语言】结构体 ( 结构体中嵌套一级
- 下一篇: 【C 语言】二级指针内存模型 ( 指针数