结构体中套一级指针

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 

typedef struct Teacher
{
	char name[64];    // 在用结构体类型定义变量的时候就已经分配了这64个字节
	char *pAlisname;  // 一级指针    只是分配了4个字节
	int age;
}Teacher;

// 数组做函数参数会退化为指针
void printTeacher(Teacher *array, int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		printf("age : %d \n", array[i].age);
	}
}


void sortTeacher(Teacher *array, int num)
{
	int i, j;
	Teacher tmp;
	for (i = 0; i < num; i++)
	{
		for (j = 0; j < num; j++)
		{
			if (array[i].age > array[j].age)
			{
				tmp = array[i];
				array[i] = array[j];
				array[j] = tmp;
			}
		}
	}
}
int createTeacher(Teacher **pTeacher, int num)
{
	int i = 0;
	Teacher *tmp;
	tmp = (Teacher *)malloc(sizeof(Teacher) * num);
	if (tmp == NULL)
	{
		return -1;
	}
	memset(tmp, 0, sizeof(Teacher) * num);
	for (i = 0; i <  num; i++)
	{
		// 每一个节点都要挂内存
		// 对结构体嵌套的一级指针显示地分配内存
		(tmp + i)->pAlisname = (char *)malloc(60);
	}
	*pTeacher = tmp;
	return 0;
}

// 释放内存的时候需要将每一个元素的嵌套的一级指针指向的内存给先释放掉
// 然后再释放整个p
void FreeTeacher(Teacher *p, int num)
{
	int i = 0;
	if (p == NULL)
	{
		return;
	}
	for (i = 0; i < num; i++)
	{
		
		if ((p + i)->pAlisname != NULL)
		{
			free((p + i)->pAlisname);
			// free(p[i].pAlisname);   // 这种写法也是可以的
		}
		// 错误的写法
		/*
		if (p->pAlisname != NULL)
		{
			free(p->pAlisname);
			// 这里不能先free(p)  否则后面的内存就无法释放,因为p是首地址
		}
		*/
	}
	free(p);
}




void main()
{
	int i = 0, ret = 0;
	int num = 3;
	Teacher *pArray = NULL;
	ret = createTeacher(&pArray,3);
	if (ret == -1)
	{
		printf("func createTeacher() err : %d\n", ret);
		return;
	}
	for (i = 0; i < 3; i++)
	{
		printf("\n please enter age: ");
		scanf("%d", &((pArray + i)->age));
		// scanf("%d", &(pArray[i].age));   // 这种写法也是可以的
		// scanf("%d", &(pArray->age));   // 错误的写法

		printf("\n please enter name: ");
		// 向指针所指向的内存空间拷贝数据
		scanf("%s", (pArray + i)->name);  // name本身是数组的首地址

		printf("\n please enter alisname: ");
		// 向指针所指向的内存空间拷贝数据
		scanf("%s", (pArray + i)->pAlisname);

	}
	// 打印老师的年龄
	printf("排序前+- : \n");
	printTeacher(pArray, 3);
	sortTeacher(pArray, 3);
	printf("排序后+- : \n");
	printTeacher(pArray, 3);

	FreeTeacher(pArray, 3);
	system("pause");

}

结构体中套一级指针_第1张图片

你可能感兴趣的:(结构体)