结构体套二级指针

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct Teacher 
{
	char name[64];
	int age;
	char** stuName;//每个老师带n个学生(第一维),每个学生的名字(字符串,第二维)
}Teacher;

int createTArr(Teacher** tArr,int num,int stu_num){
	Teacher* p =NULL;//辅助指针
	p = (Teacher*)malloc(sizeof(Teacher)*num);

	for(int i=0;i<num;i++){
		p[i].stuName = (char**)malloc(sizeof(char*)*stu_num);

		for(int j=0;j<stu_num;j++){
			p[i].stuName[j] = (char*)malloc(64);
		}
	}
	*tArr = p;//挂上
	return 0;
}

int freeTArr(Teacher** tArr,int num,int stu_num){
	Teacher* p = *tArr;
	//先释放每个学生的名字(字符串)
	for(int i=0;i<num;i++){

		for(int j=0;j<stu_num;j++){
			if(p[i].stuName[j]!=NULL){//释放一级指针char*
				free(p[i].stuName[j]);
				p[i].stuName[j] = NULL;
			}
		}

		if (p[i].stuName!=NULL)//释放二级指针char**
		{
			free(p[i].stuName);
			p[i].stuName = NULL;
		}
	}
	if(*tArr!=NULL){//释放一级指针Teacher*
		free(*tArr);
		*tArr = NULL;
	}
	return 0;
}

void main() {
	Teacher* tArr = NULL;
	createTArr(&tArr,2,2);

	for(int i=0;i<2;i++){
		printf("请输入老师名字:");
		gets(tArr[i].name);
		for(int j=0;j<2;j++){
			printf("请输入学生名字:");
			gets(tArr[i].stuName[j]);
		}
	}
	printf("\n\n\n");
	for(int i=0;i<2;i++){
		printf("老师名字:");
		puts(tArr[i].name);
		for(int j=0;j<2;j++){
			printf("学生名字:");
			puts(tArr[i].stuName[j]);
		}
	}

	freeTArr(&tArr,2,2);
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/itswrj/article/details/88749624
今日推荐