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

代码:

/**
时间: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");
}

效果截图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值