使用动态内存分配来消除使用变体记录造成的内存空间浪费(存货系统)

来源:互联网 发布:淘宝客采集软件神器 编辑:程序博客网 时间:2024/05/21 19:26

inventor.h

 


    /*
    ** 存货记录的声明
    */
   
    /*
    ** 包含零件专用信息的结构
    */
    typedef struct {
            int cost;
            int supplner;
    }Partinfo;
   
    /*
    **存储装配件专用信息结构
    */
    typedef struct {
            int n_parts;
            struct SUBASSYPART{
                char partno[10];
                short quan;
                  
            }*part;
    }Subassyinfo;
   
    /*
    **存货记录结构,它是一个变体记录
    */
    typedef struct {
         char partno[10];
         int quan;
         enum {PART, SUBASSY} type;
         union {
             Partinfo *part;
             Subassyinfo *subassy;     
         } info;    
    }Invrec;

 

 

 

inventer.c

 


    #include <stdlib.h>
    #include <stdio.h>
    #include "inventor.h"
   
    /*
    **用户创建SUBASSEMBLY(装配件)存货记录的函数
    */
   
    Invrec *create_subassy_record(int n_parts)
    {
        Invrec *new_rec;
       
        //试图为Invrec部分分配内存
        new_rec = malloc(sizeof(Invrec));
        if(new_rec != NULL)
        {
            //内存分配成功,现在存储SUBASSYINFO部分
            new_rec->info.subassy = malloc(sizeof(Subassyinfo));
            if(new_rec->info.subassy != NULL)
            {
                //为零件获取一个足够大的数组
                new_rec->info.subassy->part = malloc(n_parts * sizeof(struct SUBASSYPART)); 
                if(new_rec->info.subassy->part != NULL)
                {
                    //获取内存,填充我们已经知道值的字段,然后返回
                    new_rec->type = SUBASSY;
                    new_rec->info.subassy->n_parts = n_parts;
                    return new_rec;                              
                }  
               
                //释放内存
                free(new_rec->info.subassy);                   
            }   
            free(new_rec);      
        }
        return NULL;    
    }

    /*
    ** 释放存货记录的函数
    */
    void discard_inventory_record(Invrec *record)
    {
        //删除记录中的变体部分
        switch(record->type)
        {
            case SUBASSY:
                 free(record->info.subassy->part);
                 free(record->info.subassy);  
                 break;
            
             case PART:
                  free(record->info.part);
                  break;                
        } 
       
        //删除记录的主体部分
        free(record);  
    }

 

    //小测试
    void main()
    {
      int n_part=10;
      Invrec *rec;
     
      rec=create_subassy_record(n_part);
      if(rec != NULL){
       printf("%d",rec->info.subassy->n_parts);
       }
       discard_inventory_record(rec);
       getchar();   
    }

原创粉丝点击