0
点赞
收藏
分享

微信扫一扫

结构体嵌套指针的使用

米小格儿 2022-04-13 阅读 102
c语言

结构体嵌套指针

1.结构体嵌套一级指针

结构体定义如下:

struct Person{
	char *name;
	int age;
};

多次malloc,创建顺序:
malloc(sizeof(struct Person *)); 使用struct Person **类型变量去接收
malloc(sizeof(struct Person)); 使用struct Person *类型变量去接收
malloc(sizeof(char)); 使用char *类型变量去接收
多次free,释放顺序
free(char *);
free(struct Peron *);
free(struct Perons **);

代码如下:
堆区创建结构体指针数组

struct Person **allocateSpace(int len)
{
	struct Person **temp = malloc(sizeof(struct Person *)*len);
	for(int i = 0; i < len; i++)
	{
		//在堆区给结构体分配内存
		temp[i] = malloc(sizeof(struct Person));
		temp[i]->name = malloc(sizeof(char*) * 64);
		sprintf(temp[i]->name,"name_%d",i+1);
		temp[i]->age = 10 + i;
	}
	return temp;
}

堆区释放结构体指针数组

void freeSpace(struct Person **pArray,int len)
{
	if(pArray == NULL || len < 0)
		return;
	
	for(int i = 0; i < 3; i++)
	{
		if(pArray[i]->name != NULL)
		{
			free(pArray[i]->name);
			pArray[i]->name = NULL;
		}
		free(pArray[i]);
	}
	
	free(pArray);
	pArray = NULL;
}

打印结构体指针数组指向的内容

void printPerson(struct Person **pArray,int len)
{
	for(int i = 0; i < len; i++)
		printf("姓名:%s  年龄:%d\n",pArray[i]->name,pArray[i]->age);	
}

测试案例

void test()
{
	struct Person **pArray = NULL;
	pArray = allocateSpace(3);
	printPerson(pArray,3);
	free(pArray,3)
	pArray = NULL;
	
}

2.结构体嵌套二级指针

结构体定义

struct Teacher{
	char *name;
	char **students;
};

malloc(sizeof(struct Teacher *)); 使用struct Teacher **类型变量去接收

代码如下:
堆区创建结构体指针数组

void allocateSpace(struct Teacher ***teachers,int teachers_len,int students_len)
{
	if(teachers == NULL)
		return;
	
	//开辟内存
	struct Teacber **ts = malloc(sizeof(struct Teacher*) * teachers_len);
	//给每个老师分配内存
	for(int i = 0; i < teachers_len; i ++)
	{
		ts[i] = malloc(sizeof(struct Teacher));
	
		//给老师的姓名分配内存
		ts[i]->name = malloc(sizeof(char)*64);
		sprintf(ts[i]->name,"Teacher_%d",i+1);
		
		tsp[i]->students = malloc(sizeof(char*)* students_len);
		for(int j = 0; i < students_len; j++)
		{
			ts[i]->students[j] = malloc(sizeof(char)*64);
			sprintf(ts[i]->students[j],"%s_Student_%d",ts[i]->name,j+1);
		}
		
	}
	*teachers = ts;
}

释放结构体指针数组指向的内存

void freeSpace(struct Teacher **pArray,int teachers_len,int students_len)
{
	if(pArray == NULL)
		return;
	
	for(int i = 0; i < teachers_len; i++)
	{
		for(int j = 0; j < students_len; j++)
		{
			//释放学生的姓名
			if(pArray[i]->students[j] != NULL)
			{
				free(pArray[i]->students[j]);
				pArray[i]->students[j] = NULL;
			}
		}
		//释放老师的姓名
		if(pArray[i]->name != NULL)
		{
			free(pArray[i]->name);
			pArray[i]->name = NULL;
		}
		//释放学生的数组
		if(pArray[i]->students != NULL)
		{
			free(pArray[i]->students);
			pArray[i]->students = NULL;
		}
		//释放老师
		if(pArray[i] != NULL)
		{
			free(pArray[i]);
			pArray[i] = NULL;
		}
	}
	//释放老师的数组
	free(pArray);
	pArray = NULL;
}

打印结构体指针数组指向的内容

void printTeachers(struct Teacher **pArray,int teachers_len,int students_len)
{
	if(pArray == NULL)
		return;
	
	for(int i = 0; i < teachers_len; i++)
	{
		printf("%s",pArray[i]->name);
		for(int j = 0; j < students_len; j++)
		{
			printf("    %s\n",pArray[i]->students[j]);
		}
	}
} 

测试函数

void test()
{
	struct Teacher **pArray == NULL;
	allocateSpace(&pArray,3,4);
	printTeachers(pArray,3,4);
	freeSpace(pArray);
	pArray = NULL;
}
举报

相关推荐

0 条评论