开拓网站建设,珠海市住房和城乡建设局网站,微商各种软件拿码渠道,宣武网站开发在上一篇博客中讲完了动态内存分配#xff0c;这时候我们就可以改进之前写的通讯录了#xff0c;可以将其升级为动态内存的版本#xff0c;既不用担心联系人满了#xff0c;也不用担心内存浪费太大。
要将其改为动态版本主要是两件事#xff0c;首先初始化的时候我们要动…在上一篇博客中讲完了动态内存分配这时候我们就可以改进之前写的通讯录了可以将其升级为动态内存的版本既不用担心联系人满了也不用担心内存浪费太大。
要将其改为动态版本主要是两件事首先初始化的时候我们要动态开辟data的空间光动态开辟还不够我们还要增加一个变量来记录当前联系人列表的大小空间使用完之后要记得释放。其次我们要控制动态内存增长就是当联系人的数量与联系人列表的大小相等时我们要对data扩容。 知道了思路实现起来就很简单了。首先我们将联系人列表初始化一定的空间假设我们设定初始最大联系人数量为3我们可以在头文件中用#define来定义方便后续修改.与此同时我们也可以用#define来定义每次扩容的空间。同时对结构体增加一个变量size记录当前最大可容纳联系人数量。
#define INIT_SIZE 3
#define ADD_SIZE 2typedef struct Contact
{People* data;size_t count;size_t size;
}Contact;
然后原来初始化通讯录的代码进行修改。
//动态版本初始化通讯录
void Init_Contact(Contact* pc)
{assert(pc);pc-data (People*)malloc(sizeof(People) * INIT_SIZE);pc-size INIT_SIZE;if (pc-data NULL){perror(malloc fail);exit(-1);}int i 0;for (i 0; i pc-size; i){*((pc-data[i]).name) 0;(pc-data[i]).age 0;*((pc-data[i]).sex) 0;*((pc-data[i]).tele) 0;*((pc-data[i]).address) 0;}pc-count 0;
}当我们使用动态内存来实现通讯录时为了方便释放内存我们再写一个函数用来释放在退出通讯录之前使用这个函数进行内存释放。
void Destroy_Contact(Contact* pc)
{assert(pc);free(pc-data);pc-data NULL;pc-size 0;pc-count 0;
}
接下来就要考虑增容的问题了增容只会在Add中出现我们将增容操作与判断size和count的关系写在一个函数Check里每次进入Add函数之后都要先使用一次Check函数来判断是否需要增容。
void Check(Contact* pc)
{assert(pc);if (pc-count pc-size)//增容{People* ptr (People*)realloc(pc-data,sizeof(People) * (pc-size ADD_SIZE));if (ptr NULL){perror(realloc fail);exit(-1);}pc-data ptr;}
} 再对之前的一些小细节进行一些小修改就能实现动态版本了。