结构体中的一维,二维指针和内存的释放

2024-06-14 18:48

本文主要是介绍结构体中的一维,二维指针和内存的释放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码:

/**
时间:2016.8.25 22:47
作者:一叶扁舟
作用:用来练习结构体即结构体的一维和二维指针
**/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"typedef struct Teacher{//老师的年龄int age;//老师的名字char name[64];//老师的外号,别名char *s_name;//老师所带的学生的名字char** stuName;
}Teacher;//创建num个老师的对象
Teacher * creatTeacher(int teaNum,int stuNum){Teacher *teacher = (Teacher*)malloc(teaNum*sizeof(Teacher));if (teacher == NULL){return NULL;}//初始化for (int i = 0; i < teaNum; i++){memset(&teacher[i],0,sizeof(Teacher));//	memset(teacher + 1, 0, sizeof(Teacher));//给s_name创建内存空间char *in_s_name= (char*)malloc(64 * sizeof(char));memset(in_s_name, 0, 64 * sizeof(char));teacher[i].s_name = in_s_name;{//给每一个老师带的学生名字创建二维空间char **p = (char**)malloc(stuNum*sizeof(char*));for (int j = 0; j < stuNum; j++){p[j] = (char*)malloc(64 * sizeof(char));//p[j]指向一个64*sizeof(char)的空间memset(p[j], 0, 64 * sizeof(char));}teacher[i].stuName = p;}}return teacher;
}
//释放二维指针
void freeSeconPoint(char **p, int num){for (int i = 0; i < num; i++){if (p[i] != NULL){ free(p[i]);		}}free(p);
}//手动释放内存
void freeTeacher(Teacher *teacher,int  teaNum,int stuNum){if (teacher == NULL){return;}//手动释放结构体中的一维指针(即释放的是一维指针指向的空间)for (int i = 0; i < teaNum; i++){char *s_name = teacher[i].s_name;//这个是错误的,因为这个不是指针,即分配的内存在栈中,这里面的东西是交个teacher统一释放//系统会拿着teacher的首地址统一的释放掉内存/**if (teacher[i].name != NULL){free(teacher[i].name);}*/if (s_name != NULL){free(s_name);}//手动释放二维指针if (teacher[i].stuName != NULL){freeSeconPoint(teacher[i].stuName, stuNum);}}if (teacher != NULL){free(teacher);teacher = NULL;}
}//输出所有老师的信息:
void printTeacher(Teacher *teacher, int teaNum, int stuNum){for (int i = 0; i < teaNum; i++){printf("\n老师的年龄:%d",teacher[i].age);printf("\n老师的名字:%s", teacher[i].name);printf("\n老师的别名:%s", teacher[i].s_name);printf("\n老师所带的学生:\n");for (int j = 0; j < stuNum; j++){printf("%s \t",teacher[i].stuName[j]);}printf("\n");}return;
}
void main(){//创建两个老师,每个老师带三个学生int teaNum = 2, stuNum = 3;Teacher *teacher = creatTeacher(teaNum, stuNum);if (teacher == NULL){return ;} for (int i = 0; i < teaNum; i++){char *in_s_name = teacher[i].s_name;printf("\n请输入老师的年龄:");scanf("%d",&(teacher[i].age));printf("\n请输入老师的名字:");scanf("%s",teacher[i].name);printf("\n请输入老师的别名:");scanf("%s", in_s_name);//老师所带学生的名字for (int j = 0; j < stuNum; j++){char **in_stuName = teacher[i].stuName;printf("\n请输入老师所带学生的名字:"); scanf("%s", in_stuName[j]);}}//输出结果printTeacher(teacher, teaNum, stuNum);//释放内存freeTeacher(teacher, teaNum, stuNum);system("pause");
}

效果截图:



这篇关于结构体中的一维,二维指针和内存的释放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061224

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径