【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
生活随笔
收集整理的這篇文章主要介紹了
【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、結構體中嵌套一級指針
- 1、聲明 結構體類型
- 2、為 結構體 變量分配內存 ( 分配內存時先 為結構體分配內存 然后再為指針分配內存 )
- 3、釋放結構體內存 ( 釋放內存時先釋放 指針成員內存 然后再釋放結構頭內存 )
- 二、完整代碼示例
一、結構體中嵌套一級指針
1、聲明 結構體類型
聲明 結構體類型 : 這里注意 , 在結構體中 , 定義一個 一級指針 變量 , 注意與 數組類型區別 ;
- 結構體內定義數組 , 聲明變量時 , 會自動分配數組內存 ;
- 結構體內定義指針 , 聲明變量時 , 只會為 4 字節指針分配內存 ;
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 : Russia Student age = 18 Student age = 21 請按任意鍵繼續. . .總結
以上是生活随笔為你收集整理的【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C 语言】结构体 ( 结构体 数组 作
- 下一篇: 【C 语言】结构体 ( 结构体中嵌套二级