结构体嵌套二级指针模型

目标:全部在堆区开辟内存空间,实现1个老师带4个学生模型,一共有三个老师。

测试代码

#include 
#include 
#include 

typedef struct Teacher
{
     
	char *name;
	char **student;
} Teacher;

int freePArray(struct Teacher **pArray)
{
     
	if (NULL == pArray)
	{
     
		return -2;
	}

	for (int i = 0; i < 3; ++i)
	{
     
		for (int j = 0; j < 4; ++j)
		{
     
			if (NULL == pArray[i]->student[j])
			{
     
				return -3;
			}

			//释放student[0] [1] [2] [3]
			free(pArray[i]->student[j]);
			pArray[i]->student[j] = NULL;
		}

		//释放student
		free(pArray[i]->student);
		pArray[i]->student = NULL;

		//释放name
		free(pArray[i]->name);
		pArray[i]->name = NULL;

		//释放pArray[i]
		free(pArray[i]);
		pArray[i] = NULL;
	}

    return 0;
}

int test()
{
     
	//创建结构体数组指针
	Teacher **pArray = malloc(sizeof(Teacher *) * 3);

	if (NULL == pArray)
	{
     
		return -1;
	}

	for (int i = 0; i < 3; ++i)
	{
     
		//开辟结构体空间
		pArray[i] = malloc(sizeof(Teacher));

		//开辟结构体成员中name的空间
		pArray[i]->name = malloc(sizeof(char) * 10);

		//格式化赋值
		sprintf(pArray[i]->name, "Teacher_%d", i + 1);

		//开辟结构体成员student四个空间
		pArray[i]->student = malloc(sizeof(char *) * 4);

		//为每一个student开辟空间并赋值
		for (int j = 0; j < 4; ++j)
		{
     
			pArray[i]->student[j] = malloc(sizeof(char) * 10);
			sprintf(pArray[i]->student[j], "Student_%d", j + 1);
		}
	}

	//遍历
	for (int i = 0; i < 3; ++i)
	{
     
		printf("%s\n", pArray[i]->name);

		for (int j = 0; j < 4; ++j)
		{
     
			printf("\t%s\n", pArray[i]->student[j]);
		}
	}

//释放堆区内部开辟的空间
	freePArray(pArray);

    if(pArray != NULL)
    {
     
        free(pArray);
        pArray = NULL;
    }

    return 0;
}

int main(int argc, const char *argv[])
{
     
	test();
    
	return 0;
}

测试结果

结构体嵌套二级指针模型_第1张图片

内存分布示意图结构体嵌套二级指针模型_第2张图片

你可能感兴趣的:(C,指针,堆栈,C,二级指针,结构体)