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

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

相关文章

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少