这一篇博客主要总结结构体相关的知识点,简单的基础知识这里就不再赘述了,这里说几下结构体中需要注意的问题。
基础
接下来看下这段代码
#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;
}