结构体中套一级 二级指针问题

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Teacher
{
char name[64];
int age;
char *alisname;//注意这里只是定义了一级指针变量,没有给他开辟内存空间
char **stuname;//结构体下挂二级指针,没有给他开辟内存空间



}Teacher;


//打印函数
void printArray(Teacher *Array,int num)
{
for (int i = 0; i < num; i++)
{
printf("Array[i]:%d\n", Array[i].age);
}
}
//冒泡法排序
void sortArray(Teacher *Array, int num)
{
Teacher tmp;
for (int  i = 0; i < num; i++)
{
for (int j = i+1; j < num; j++)
{
if (Array[i].age > Array[j].age)//从小到大
{
tmp = Array[i];
Array[i] = Array[j];
Array[j] = tmp;
}
}
}


}
//开辟内存空间 方法一:高一级指针(形参)修改实参
int creatArray(Teacher **pArray, int num)
{
int ret = 0;
Teacher *tmp = NULL;
tmp = (Teacher *)malloc(num * sizeof(Teacher));
if (tmp==NULL)
{
ret = -1;
printf("func err tmp==NULL:%d",ret);
return ret;
}
memset(tmp,0,sizeof(tmp));//防止产生野指针
//给结构体中一级指针alisname分配内存
for (int i = 0; i < num; i++)
{
tmp[i].alisname = (char *)malloc(60 * sizeof(char));
//给结构体中挂的二级指针.stuname手动开辟二级指针
{
char **p = (char **)malloc(num * sizeof(char *));//开辟二级指针的行
for (int j = 0; j < num; j++)
{
p[j] = (char *)malloc(60*sizeof(char));
}
tmp[i].stuname = p;//定义一个二级指针来接着tmp[i].stuname,方便二级指针手动开辟空间 
}
}


//*souce = tmpsource; 用二级指针形参改变一级指针实参
*pArray = tmp;


return ret;
}


//开辟内存空间 方法二:return方法
Teacher *creatArray01(int num)
{
int ret = 0;
Teacher *tmp = NULL;
tmp = (Teacher *)malloc(num * sizeof(Teacher));
if (tmp == NULL)
{
ret = -1;
printf("func err tmp==NULL:%d", ret);
return NULL;
}
memset(tmp, 0, sizeof(tmp));//防止产生野指针
//给结构体中一级指针alisname分配内存
for (int i = 0; i < num; i++)
{
tmp[i].alisname = (char *)malloc(60 * sizeof(char));
//给结构体中挂的二级指针.stuname手动开辟二级指针
{
char **p = (char **)malloc(num * sizeof(char *));//开辟二级指针的行
for (int j = 0; j < num; j++)
{
p[j] = (char *)malloc(60 * sizeof(char));
}
tmp[i].stuname = p;//定义一个二级指针来接着tmp[i].stuname,方便二级指针手动开辟空间 
}
}



return tmp;
}
//释放资源 方法一:
void freeArray(Teacher *pArray, int  num)
{
if (pArray==NULL)
{
printf("func err pArray==NULL\n");
return;
}
//1.先释放.alisname 一级指针
for (int i = 0; i < num; i++)
{
free(pArray[i].alisname);
//2.在释放手动开辟的二级指针
{
if (pArray[i].stuname!=NULL)
{
//释放时候,先把二级指针接过来,方便下面处理释放资源,注意这个跟开辟时候接不太一样
char **p = pArray[i].stuname;
for (int j = 0; j < num; j++)
{
if (p[j]!=NULL)
{
free(p[j]);
}
}
//释放二级指针行资源
if (p!=NULL)
{
free(p);
}
//在置空一下,但是此函数 没法改变实参,不写这句也可以
pArray[i].stuname = NULL;
}
}
}
//2.开辟空间中先申请个一级指针,得后释放掉
if (pArray != NULL)
{
free(pArray);
}
}
//释放资源方法二
void freeArray01(Teacher **pArray, int  num)
{
Teacher *tmp = NULL;
if (pArray == NULL)
{
printf("func err pArray==NULL\n");
return;
}


tmp = *pArray;//把二级指针还原成一级指针进行释放资源


//1.先释放.alisname 一级指针
for (int i = 0; i < num; i++)
{
free(tmp[i].alisname);
//2.在释放手动开辟的二级指针
{
if (tmp[i].stuname != NULL)
{
//释放时候,先把二级指针接过来,方便下面处理释放资源,注意这个跟开辟时候接不太一样
char **p = tmp[i].stuname;
for (int j = 0; j < num; j++)
{
if (p[j] != NULL)
{
free(p[j]);
}
}
//释放二级指针行资源
if (p != NULL)
{
free(p);
}
//在置空一下
tmp[i].stuname = NULL;
}
}


}
//2.开辟空间中先申请个一级指针,得后释放掉
if (tmp != NULL)
{
free(tmp);
}
//最后释放后,置空,不要少这句
*pArray = NULL;
}
//结构体数组 输入老师年龄 进行排序
int  main1501()
{
int ret = 0;
int num = 3;
//Teacher Array[3];//结构体数组  这个在栈上开辟的内存
Teacher *Array = NULL;


//指针内存第三种模型
//方法一:采用高一级指针(形参)修改实参 开辟内存空间
//ret = creatArray(&Array,num);
//if (ret!=0)
//{
// printf("func creatArray() err:%d\n",ret);
// return ret;
//}


//开辟内存空间 方法二:return方法
Array = creatArray01(num);
if (Array == NULL)
{
printf("func creatArray01() err:%d\n", ret);
return ret;
}


for (int i = 0; i < num; i++)
{


printf("please enter teacher age: ");
scanf("%d", &Array[i].age);


printf("please enter teacher name: ");
scanf("%s", Array[i].name);


printf("please enter teacher alisname: ");
scanf("%s", Array[i].alisname);//没有开辟内存空间,需要给成员变量初始化



for (int j = 0; j < num; j++)
{
printf("please enter teacher stuname:%d ",j+1);
scanf("%s", Array[i].stuname[j]);//二级指针  没有开辟内存空间,需要给成员变量初始化
}

}


//打印函数
printf("raw material\n");
printArray(Array, num);


//冒泡法排序
sortArray(Array, num);


//打印函数
printf("raw material after sortArray\n");
printArray(Array, num);


//释放资源 方法一:
freeArray(Array,num);
Array = NULL;
//freeArray01(&Array, num);
printf("hello...");
system("pause");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值