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

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

相关文章

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

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

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可