C语言复习(七)——结构体

这一篇博客主要总结结构体相关的知识点,简单的基础知识这里就不再赘述了,这里说几下结构体中需要注意的问题。

基础

接下来看下这段代码

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

typedef struct teacher
{
	char name[30];
	int age;
}Teacher;
//声明一个结构体类型

void Inint_T(Teacher **t, int num)
{
	Teacher *p = NULL;
	p = (Teacher *)malloc(sizeof(Teacher)*num);
	if (p == NULL)
	{
		return;
	}
	*t = p;
}

void creat_T(Teacher *t, int num)
{
	int i;
	for (i = 0; i < num; i++)
	{
		printf("请输入第%d个人的姓名:",i+1);
		scanf_s("%s", t[i].name,30);
		printf("请输入第%d个人的年龄:", i + 1);
		scanf_s("%d", &t[i].age);
	}
}

void print_T(Teacher *t, int num)
{
	int i;
	for (i = 0; i < num; i++)
	{
		printf("第%d个人的姓名:%s\n", i + 1, t[i].name);
		printf("第%d个人的年龄:%d\n", i + 1, t[i].age);
	}
}

void sort_T(Teacher *t, int num)
{
	int i, j;
	for (i = 0; i < num - 1; i++)
	{
		for (j = 0; j < num - 1 - i; i++)
		{
			if (t[j].age > t[j + 1].age)
			{
				Teacher tem = t[j];
				t[j] = t[j + 1];
				t[j + 1] = tem;
			}
		}
	}
}

void free_T(Teacher *t)
{
	if(t == NULL)
	{
		return; 
	}
	else
	{
		free(t);
		t = NULL;
	}

}
int main(void)
{
	Teacher *t1 = NULL;
	int num = 3;
	Inint_T(&t1, num);
	creat_T(t1, num);
	print_T(t1, num);
	sort_T(t1, num);
	print_T(t1, num);
	free_T(t1);
	system("pause");
	return 0;
}

接下来说下结构体中嵌套一级指针和二级指针的情况
我们看下这段代码

typedef struct teacher
{
	char *name;
	int age;
}Teacher;

在结构体里面声明了一个一级指针;

printf("请输入第%d个人的姓名:",i+1);
scanf_s("%s", t[i].name,30);

而我们在执行这段代码的时候,会抛出异常,为什么呢?
在这里插入图片描述
这是因为我们并没有给name分配内存。
没有内存哪来的指针?

void Inint_T(Teacher **t, int num)
{
	Teacher *p = NULL;
	p = (Teacher *)malloc(sizeof(Teacher)*num);
	if (p == NULL)
	{
		return;
	}
	for (int i = 0; i < num; i++)
	{
		p[i].name = (char *)malloc(sizeof(char) * 30);
	}

	*t = p;
}

这是修改之后的代码,在对结构体初始化的时候,为name分配了30个字节大小的内存空间。
注意看free()这部分代码

void free_T(Teacher *t,int num)
{
	if(t == NULL)
	{
		return; 
	}
	else
	{
		for (int i = 0; i < num; i++)
		{
			if (t[i].name != NULL)
			{
				free(t[i].name);
			}
		}
		free(t);
		t = NULL;
	}

}

要注意的是释放内存的时候先申请的后释放,后申请的先释放。
接下来看一下结构体中嵌套二级指针的用法

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

typedef struct teacher
{
	char *name;
	char **studentname;
	int age;
}Teacher;
//声明一个结构体类型

void Inint_T(Teacher **t, int num)
{
	Teacher *p = NULL;
	p = (Teacher *)malloc(sizeof(Teacher)*num);
	if (p == NULL)
	{
		return;
	}
	for (int i = 0; i < num; i++)
	{
		p[i].name = (char *)malloc(sizeof(char) * 30);
		p[i].studentname = (char **)malloc(sizeof(char *)*3);
		for (int j = 0; j < 3; j++)
		{
			p[i].studentname[j] = (char *)malloc(sizeof(char) * 30);
		}
	}

	*t = p;
}

void creat_T(Teacher *t, int num)
{
	int i;
	for (i = 0; i < num; i++)
	{
		printf("请输入第%d个老师的姓名:",i+1);
		scanf_s("%s", t[i].name,30);
		printf("请输入第%d个老师的年龄:", i + 1);
		scanf_s("%d", &t[i].age);
		for (int j = 0; j < 3; j++)
		{
			printf("请输入第%d个老师的第%d个学生的姓名:", i + 1,j + 1);
			scanf_s("%s",t[i].studentname[j], 30);

		}
	}
}

void print_T(Teacher *t, int num)
{
	int i;
	for (i = 0; i < num; i++)
	{
		printf("第%d个人的姓名:%s\n", i + 1, t[i].name);
		printf("第%d个人的年龄:%d\n", i + 1, t[i].age);
		for (int j = 0; j < 3; j++)
		{
			printf("第%d个老师的第%d个学生的姓名:%s\n", i + 1, j + 1, t[i].studentname[j]);
		}
	}
}

void sort_T(Teacher *t, int num)
{
	int i, j;
	for (i = 0; i < num - 1; i++)
	{
		for (j = 0; j < num - 1 - i; j++)
		{
			if (t[j].age > t[j + 1].age)
			{
				Teacher tem = t[j];
				t[j] = t[j + 1];
				t[j + 1] = tem;
			}
		}
	}
}

void free_T(Teacher *t,int num)
{
	if(t == NULL)
	{
		return; 
	}
	else
	{
		for (int i = 0; i < num; i++)
		{
			if (t[i].name != NULL)
			{
				for (int j = 0; j < 3; j++)
				{
					if (t[i].studentname[j] != NULL)
					{
						free(t[i].studentname[j]);
					}
				}
				free(t[i].name);
			}
		}
		free(t);
		t = NULL;
	}

}
int main(void)
{
	Teacher *t1 = NULL;
	int num = 3;
	Inint_T(&t1, num);
	creat_T(t1, num);
	printf("排序前:\n");
	print_T(t1, num);
	sort_T(t1, num);
	printf("排序后:\n");
	print_T(t1, num);
	free_T(t1,num);
	system("pause");
	return 0;
}
发布了31 篇原创文章 · 获赞 8 · 访问量 3682

猜你喜欢

转载自blog.csdn.net/qq_42689353/article/details/104416152