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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walkerrev_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值