鱼C论坛

 找回密码
 立即注册
查看: 1259|回复: 1

小白求助 谁能帮忙分析分析代码 结构体套二级指针

[复制链接]
发表于 2020-3-16 13:02:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

/*
"name1111"
"name2222"
"name3333"
*/

typedef struct Teacher
{
        //char student[10][30]
        char name[64];
        char *alisname;
        char **stuname;
        int age ;
        int id;
}Teacher;

void printTeacher(Teacher *array, int num)
{
        int i = 0;

        for (i=0; i<num; i++)
        {
                printf("age:%d \n", array[i].age);
        }
}

void sortTeacer(Teacher *array, int num)
{
        int                i,j;
        Teacher tmp;

        for (i=0; i<num; i++)
        {
                for (j=i+1; j<num; j++)
                {
                        if (array[i].age > array[j].age)
                        {
                                tmp = array[i];  //=号操作  赋值操作
                                array[i] = array[j];
                                array[j] = tmp;
                        }
                }
        }
}

Teacher * createTeacher01(int num)
{
        Teacher * tmp = NULL;
        tmp = (Teacher *)malloc(sizeof(Teacher) * num); //        Teacher                Array[3]
        if (tmp == NULL)
        {
                return NULL;
        }
        return tmp; //

}

int createTeacher02(Teacher **pT, int num)
{
        int i = 0, j = 0;
        Teacher * tmp = NULL;
        tmp = (Teacher *)malloc(sizeof(Teacher) * num); //        Teacher                Array[3]
        if (tmp == NULL)
        {
                return -1;
        }
        memset(tmp, 0, sizeof(Teacher) * num);

        for (i=0; i<num; i++)
        {
                char **p = NULL;

                //malloc一级指针
                tmp[i].alisname = (char *)malloc(60);

                //二级指针的第三种内存模型
                p = (char **)malloc(3 * sizeof(char *));  //打造二维内存
                for (j=0; j<3; j++)
                {
                        p[j] = (char *)malloc(120);
                }
                tmp[i].stuname = p; //
       
        }

        *pT = tmp;  //二级指针 形参 去间接的修改 实参 的值
        return 0; //
}

void FreeTeacher(Teacher *p, int num)
{
        int        i = 0, j = 0;
        if (p == NULL)
        {
                return;
        }
        for (i=0; i<num; i++)
        {
                //释放一级指针
                if (p[i].alisname != NULL)
                {
                        free(p[i].alisname);
                }

                //释放二级指针
                if (p[i].stuname != NULL)
                {
                        char **myp = p[i].stuname ;
                        for (j=0; j<3; j++)
                        {
                                if (myp[j] != NULL)
                                {
                                        free(myp[j]);
                                }
                        }
                        free(myp);
                        p[i].stuname = NULL;
                }
        }
        free(p);
}

void main()
{
        int                        ret = 0;
        int                        i = 0, j = 0;
        //Teacher                Array[3];  //在stack 分配内存
        int                        num = 3;
        Teacher *pArray = NULL;
        ret = createTeacher02(&pArray, num);
        if (ret != 0)
        {
                printf("func createTeacher02() er:%d \n ", ret);
                return ;
        }

        for (i=0; i<num; i++)
        {
                printf("\nplease enter age:");
                scanf("%d", & (pArray[i].age) );

                //printf("\nplease enter name:");
                //scanf("%s",  pArray[i].name ); //向指针所指的内存空间copy数据

                printf("\nplease enter alias:");
                scanf("%s",  pArray[i].alisname );  //向指针所指的内存空间copy数据

                for (j=0; j<3; j++)
                {
                        printf("please enter student name:");
                        scanf("%s",pArray[i].stuname[j] );
                }
        }

        //打印老师年龄
        //         for (i=0; i<num; i++)
        //         {
        //                 printf("age:%d \n", Array[i].age);
        //         }

        printTeacher(pArray, num);

        sortTeacer(pArray, num);

        printf("排序之后\n");

        printTeacher(pArray, num);

        FreeTeacher(pArray, num);

        printf("hello...\n");
        system("pause");
        return ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-16 13:03:21 | 显示全部楼层
F:\C语言\C提高视频\C提高day04_总结\文档\05_结构中套2级指针.bmp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表