zoukankan      html  css  js  c++  java
  • 结构体做函数参数(三)

    结构体中含有二级指针的内存分配和释放

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    typedef struct Teacher
    {
        char name[64];
        char *alisname;
        char **stuname;
        int age;
        int id;
    }Teacher;
    
    void printTeacher(Teacher *array,int num)
    {
        int i = 0;
        for (; i < num; i++)
        {
            printf("age : %d
    ",array[i].age);
        }
    }
    
    void sortTeacher(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[j];
                    array[j] = array[i];
                    array[i] = tmp;
                }
            }
        }
    }
    
    int createTeacher( Teacher **pT, int num)
    {
        int i = 0, j = 0;
        Teacher *tmp = NULL;
        tmp = (Teacher *)malloc(num * sizeof(Teacher));
        if (NULL == tmp)
        {
            return -1;
        }
    
        memset(tmp,0,sizeof(Teacher)*num);
    
        for (i = 0; i < num; i++)
        {
            char **p = NULL;
            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);
    }
    
    int main()
    {
        int ret = 0;
        int i = 0, j = 0;
        int num = 3;
        Teacher *pArray = NULL;
        ret = createTeacher(&pArray,num);
        if (ret != 0)
        {
            printf("func createTeacher() err : %d
    ",ret);
            return ret;
        }
    
        for(i = 0; i < num; i++)
        {
            printf("
    please enter age:");
            scanf("%d",&(pArray[i].age));
    
            printf("
    please enter alias:");
            scanf("%s",(pArray[i].alisname));
    
            for (j = 0; j < 3; j++)
            {
                printf("please enter student name:");
                scanf("%s",pArray[i].stuname[j]);
            }
        }
    
        printTeacher(pArray,num);
    
        sortTeacher(pArray,num);
    
        printf("after sort
    ");
        printTeacher(pArray,num);
    
        FreeTeacher(pArray,num);
        return 0;
    }
  • 相关阅读:
    JS之事件及冒泡
    DOM读取和修改内联样式
    dom查询与修改的一些常用方法
    js修改this指向的三种方法(call,bind,apply)
    JS原型概念
    JS创建对象
    JS的this(谁调用就指向谁)
    变量声明提前与函数声明提前
    JS对象创建
    正则应用之数据采集房屋网站信息
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11783793.html
Copyright © 2011-2022 走看看