malloc_free复杂结构

inventor.h

/************************************************************************/
/* 存货记录的声明                                                                     */
/************************************************************************/

//包含零件专用信息的结构
typedef struct{
	int cost;
	int supplier;
}Partinfo;//属于类型名

//存储装配件专用信息的结构
typedef struct{
	int n_parts;
	struct SUBASSYPART {
		char partno[10];
		short quan;
	}*part;//*part属于参数列表,指向给结构的一个指针
}Subassyinfo;

//存储记录结构,它是一个变体记录
typedef struct {
	char partno[10];
	int quan;
	enum {PART,SUBASSY} type;//方便删除用
	//变体部分,分别指向包装零件和存储装配件的结构,通过info来访问到union部分
	union {
		Partinfo *part;
		Subassyinfo *subassy;
	}info;
}Invrec;


invcreate.cpp

/************************************************************************/
/* 用于创建装配件(SUBASSYPART)存货记录的函数      
	需要申请的是在堆中的内存。
	在零件的结构中只需要申请结构本身的内存就可以,结构里面的是会自动创建的。
	在装配件的结构中,需要申请一个数组,一个结构。
	本函数主要解释了对于装配件如何申请空间。
	另外函数传参赋值部分是正常的函数有的。
*/
/************************************************************************/

#include "stdlib.h"
#include "stdio.h"
#include "inventor.h"
Invrec *create_subassy_record(int n_parts){
	Invrec *new_rec;

	//试图为Invrec部分分配内存
	new_rec = malloc(sizeof(Invrec));
	if(new_rec != NULL){
		//内存分配成功,现在存储

		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);

	}
}


invdelet.cpp


#include "stdlib.h"
#include "inventor.h"
void discard_inventory_record(Inverc *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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值