结构体中套二级指针

问题模型

导师学生模型

利用结构体中套二级指针 创建内存的方式

        p = (char **)malloc(3 * sizeof(char *));  //打造二维内存
        for (j = 0; j < 3; j++)
        {
            p[j] = (char *)malloc(120);
        }
        tmp[i].stuname = p; //
#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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,737评论 1 32
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,315评论 8 265
  • 周末,主旋律,带孩子。 过着一地鸡毛的生活,大的吵小的闹,天天享受这备受摧残的日子。一周两天。周而复始。 却在这简...
    小猪天堂阅读 288评论 0 1

友情链接更多精彩内容