// main.h /* */ typedef struct{ int cost; int supplier; }Partinfo; typedef struct SUBASSYPART{ char partno[10]; short quan; }subassyinfo; /* */ typedef struct { int n_parts; subassyinfo *part; }Subassyinfo; /* */ typedef struct{ char partno[10]; int quan; enum {PART,SUBASSY} type; union{ Partinfo *part; Subassyinfo *subassy; }info; }Invrec; // main.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "main.h" Invrec *create_subassy_record(int n_parts); Invrec *create_part_record(int n_partno); void destory_subassy_record(Invrec *new_rec); void destory_part_recored(Invrec *new_rec); //加入析構函數 int main() { char b[10]={'a','b','c','d','e','f'}; Invrec* a; a = (Invrec*)malloc(sizeof(Invrec)); if(a != NULL) { a = create_subassy_record(10); a->info.subassy->part->quan=100; a->quan=100; memcpy(a->partno,b,sizeof(b)); memcpy(a->info.subassy->part->partno,b,sizeof(b)); } printf("%d\r\n",a->info.subassy->n_parts); destory_subassy_record(a); if(a != NULL){ a = create_part_record(100); } printf("%d\r\n",a->info.part->cost); destory_part_recored(a); return 0; } Invrec *create_subassy_record(int n_partno) { Invrec *new_rec; new_rec = (Invrec*)malloc(sizeof(Invrec)); if(new_rec != NULL){ new_rec->info.subassy = (Subassyinfo*)malloc(sizeof(Subassyinfo)); if(new_rec->info.subassy != NULL){ new_rec->type = SUBASSY; new_rec->info.subassy->n_parts = n_partno; new_rec->info.subassy->part = (subassyinfo*)malloc(sizeof(subassyinfo)); if(new_rec->info.subassy->part != NULL) { return new_rec; } free(new_rec->info.subassy->part); } free(new_rec->info.subassy); } free(new_rec); return NULL; } void destory_subassy_record(Invrec* a) { if(a->type == SUBASSY) { free(a->info.subassy->part); free(a->info.subassy); free(a); } } Invrec* create_part_record(int cost) { Invrec *new_rec; new_rec = (Invrec*)malloc(sizeof(Invrec)); if(new_rec != NULL){ new_rec->info.part = (Partinfo*)malloc(sizeof(Partinfo)); if(new_rec->info.part != NULL) { new_rec->type = PART; new_rec->info.part->cost = cost; return new_rec; } free(new_rec->info.part); } free(new_rec); return NULL; } void destory_part_recored(Invrec *a) { if(a->type == PART) { free(a->info.part); free(a); } }