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

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

相关文章

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)