1. 程式人生 > >結構體中套一級 二級指標問題

結構體中套一級 二級指標問題

#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;
}