日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時間:2025/6/17 43 豆豆

文章目錄

  • 一、結(jié)構(gòu)體中嵌套一級指針
    • 1、聲明 結(jié)構(gòu)體類型
    • 2、為 結(jié)構(gòu)體 變量分配內(nèi)存 ( 分配內(nèi)存時先 為結(jié)構(gòu)體分配內(nèi)存 然后再為指針分配內(nèi)存 )
    • 3、釋放結(jié)構(gòu)體內(nèi)存 ( 釋放內(nèi)存時先釋放 指針成員內(nèi)存 然后再釋放結(jié)構(gòu)頭內(nèi)存 )
  • 二、完整代碼示例





一、結(jié)構(gòu)體中嵌套一級指針




1、聲明 結(jié)構(gòu)體類型


聲明 結(jié)構(gòu)體類型 : 這里注意 , 在結(jié)構(gòu)體中 , 定義一個 一級指針 變量 , 注意與 數(shù)組類型區(qū)別 ;

  • 結(jié)構(gòu)體內(nèi)定義數(shù)組 , 聲明變量時 , 會自動分配數(shù)組內(nèi)存 ;
  • 結(jié)構(gòu)體內(nèi)定義指針 , 聲明變量時 , 只會為 4 字節(jié)指針分配內(nèi)存 ;
/*** @brief The Student struct* 定義 結(jié)構(gòu)體 數(shù)據(jù)類型 , 同時為該結(jié)構(gòu)體類型聲明 別名* 可以直接使用 別名 結(jié)構(gòu)體變量名 聲明結(jié)構(gòu)體類型變量* 不需要在前面添加 struct 關(guān)鍵字*/ typedef struct Student {// 聲明變量時 , 會自動分配這 5 字節(jié)內(nèi)存// 賦值時 , 可以直接使用 = 賦值字符串char name[5];int age;int id;// 聲明變量時 , 只會為 4 字節(jié)指針分配內(nèi)存// 具體的 字符串內(nèi)存 需要額外使用 malloc 申請內(nèi)存// 賦值時 , 必須使用 strcpy 函數(shù) , 向堆內(nèi)存賦值char *address; }Student;

2、為 結(jié)構(gòu)體 變量分配內(nèi)存 ( 分配內(nèi)存時先 為結(jié)構(gòu)體分配內(nèi)存 然后再為指針分配內(nèi)存 )


為 結(jié)構(gòu)體 變量分配內(nèi)存 : 結(jié)構(gòu)體 內(nèi)存分配完成之后 , 需要立刻為 結(jié)構(gòu)體的 一級指針 成員分配內(nèi)存 ;

/*** @brief create_student 堆內(nèi)存中分配內(nèi)存* @param array 二級指針 , 指向結(jié)構(gòu)體數(shù)組* @return*/ int create_student(Student **array, int count) {// 返回值int ret = 0;// 循環(huán)控制變量int i = 0;// 臨時變量Student *tmp = NULL;// 驗證二級指針合法性if(array == NULL){ret = -1;return ret;}// 堆內(nèi)存中申請內(nèi)存tmp = (Student *)malloc(sizeof(Student) * count);// 初始化分配的內(nèi)存memset(tmp, 0, sizeof(Student) * count);// 為每個結(jié)構(gòu)體的 address 成員分配內(nèi)存for(i = 0; i < count; i++){tmp[i].address = (char *)malloc(20);}// 通過間接賦值 設(shè)置返回值*array = tmp;return ret; }

3、釋放結(jié)構(gòu)體內(nèi)存 ( 釋放內(nèi)存時先釋放 指針成員內(nèi)存 然后再釋放結(jié)構(gòu)頭內(nèi)存 )


釋放結(jié)構(gòu)體內(nèi)存 : 釋放 結(jié)構(gòu)體 內(nèi)存時 , 要先釋放 結(jié)構(gòu)體變量 的 一級指針 成員的內(nèi)存 , 然后再釋放整個 結(jié)構(gòu)體的 內(nèi)存 ;

/*** @brief free_student 釋放內(nèi)存* @param array* @return*/ int free_student(Student **array, int count) {// 返回值int ret = 0;// 循環(huán)控制變量int i = 0;// 驗證二級指針合法性if(array == NULL){ret = -1;return ret;}// 釋放 每個結(jié)構(gòu)體的 address 成員分配內(nèi)存for(i = 0; i < count; i++){free((*array)[i].address);(*array)[i].address = NULL;}// 釋放 結(jié)構(gòu)體內(nèi)存free(*array);// 指針置空 , 防止野指針*array = NULL;return ret; }



二、完整代碼示例



#include <stdio.h> #include <stdlib.h> #include <string.h>/*** @brief The Student struct* 定義 結(jié)構(gòu)體 數(shù)據(jù)類型 , 同時為該結(jié)構(gòu)體類型聲明 別名* 可以直接使用 別名 結(jié)構(gòu)體變量名 聲明結(jié)構(gòu)體類型變量* 不需要在前面添加 struct 關(guān)鍵字*/ typedef struct Student {// 聲明變量時 , 會自動分配這 5 字節(jié)內(nèi)存// 賦值時 , 可以直接使用 = 賦值字符串char name[5];int age;int id;// 聲明變量時 , 只會為 4 字節(jié)指針分配內(nèi)存// 具體的 字符串內(nèi)存 需要額外使用 malloc 申請內(nèi)存// 賦值時 , 必須使用 strcpy 函數(shù) , 向堆內(nèi)存賦值char *address; }Student;/*** @brief printf_struct_array 打印結(jié)構(gòu)體數(shù)組* @param array 數(shù)組作為函數(shù)參數(shù)退化為指針* @param count 數(shù)組中的元素個數(shù)*/ void printf_struct_array(Student *array, int count) {// 循環(huán)控制變量int i = 0;// 驗證數(shù)組合法性if(array == NULL){return;}// 打印結(jié)構(gòu)體數(shù)組中的 結(jié)構(gòu)體 age 字段for(i = 0; i < count; i++){printf("Student age = %d\n", array[i].age);} }/*** @brief sort_struct_array 對結(jié)構(gòu)體數(shù)組 按照年齡進行排序* @param array 結(jié)構(gòu)體指針* @param count 結(jié)構(gòu)體數(shù)組的元素個數(shù)*/ void sort_struct_array(Student *array, int count) {// 循環(huán)控制變量int i = 0, j = 0;// 學(xué)生年齡Student tmp;// 驗證數(shù)組合法性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 堆內(nèi)存中分配內(nèi)存* @param array 二級指針 , 指向結(jié)構(gòu)體數(shù)組* @return*/ int create_student(Student **array, int count) {// 返回值int ret = 0;// 循環(huán)控制變量int i = 0;// 臨時變量Student *tmp = NULL;// 驗證二級指針合法性if(array == NULL){ret = -1;return ret;}// 堆內(nèi)存中申請內(nèi)存tmp = (Student *)malloc(sizeof(Student) * count);// 初始化分配的內(nèi)存memset(tmp, 0, sizeof(Student) * count);// 為每個結(jié)構(gòu)體的 address 成員分配內(nèi)存for(i = 0; i < count; i++){tmp[i].address = (char *)malloc(20);}// 通過間接賦值 設(shè)置返回值*array = tmp;return ret; }/*** @brief free_student 釋放內(nèi)存* @param array* @return*/ int free_student(Student **array, int count) {// 返回值int ret = 0;// 循環(huán)控制變量int i = 0;// 驗證二級指針合法性if(array == NULL){ret = -1;return ret;}// 釋放 每個結(jié)構(gòu)體的 address 成員分配內(nèi)存for(i = 0; i < count; i++){free((*array)[i].address);(*array)[i].address = NULL;}// 釋放 結(jié)構(gòu)體內(nèi)存free(*array);// 指針置空 , 防止野指針*array = NULL;return ret; }/*** @brief 主函數(shù)入口* @return*/ int main(int argc, char* argv[], char**env) {// 聲明結(jié)構(gòu)體數(shù)組 , 該數(shù)組在棧內(nèi)存中Student *array = NULL;// 循環(huán)控制變量int i = 0;// 堆內(nèi)存中為結(jié)構(gòu)體指針分配內(nèi)存create_student(&array, 2);// 命令行中 , 接收輸入的年齡for(i = 0; i < 2; i++){// 命令換行中 接收 輸入的年齡 ,// 設(shè)置到 Student 數(shù)組元素的 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);}// 結(jié)構(gòu)體數(shù)組 按照 age 排序sort_struct_array(array, 2);// 打印結(jié)構(gòu)體數(shù)組中的 結(jié)構(gòu)體 age 字段printf_struct_array(array, 2);// 釋放堆內(nèi)存數(shù)據(jù)free_student(&array, 2);// 命令行不要退出system("pause");return 0; }

執(zhí)行結(jié)果 :

Input Age : 21Input ID : 1Input Name : TomInput Address : ChinaInput Age : 18Input ID : 2Input Name : JerryInput Address : Russia Student age = 18 Student age = 21 請按任意鍵繼續(xù). . .

總結(jié)

以上是生活随笔為你收集整理的【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。