C语言:使用realloc函数对malloc或者calloc动态分配的内存大小进行扩展
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct
{
char name[32];
int age;
char gender;
float score[3];
}Student;
typedef struct
{
Student * pData;//学生信息
int size;//容量大小
int count;//当前的记录个数
}Database;
//初始化数据库
int initDatabase(Database* db);
//销毁数据库
void destoryDatabase(Database* db);
//插入一条数据
int insertData(Database* db,Student stu);
//打印数据库的内容
void printDatabase(Database* db);
//随机生成数据
int myrandom(int range)
{
//产生一个range(范围)内的随机数
return rand()%range;
}
int main()
{
//初始化随机数种子
srand((unsigned)time(NULL));
Database db;
//初始化数据库
if(initDatabase(&db)!=0)
{
printf("数据库初始化失败!\n");
return -1;
}
//批量插入数据
for(int i=0; i<20; i++)
{
Student stu;
sprintf(stu.name,"name%d",i);
stu.age = myrandom(30);
stu.gender = myrandom(2) ? 'M' : 'F';
stu.score[0] = myrandom(100);
stu.score[1] = myrandom(100);
stu.score[2] = myrandom(100);
if(insertData(&db,stu) != 0)
{
printf("插入失败!");
break;
}
}
//打印数据库
printDatabase(&db);
//销毁数据库
destoryDatabase(&db);
return 0;
}
//初始化数据库
int initDatabase(Database* db)
{
db->size = 10;
db->count = 0;
db->pData = (Student*)calloc(db->size,sizeof(Student));
printf("%p\n",db->pData);
if(db->pData != NULL)
{
return 0;
}
return -1;
}
//销毁数据库
void destoryDatabase(Database* db)
{
free(db->pData);
db->pData = NULL;
}
//插入一条数据
int insertData(Database* db,Student stu)
{
//插入前先判断空间是否已满
if(db->count == db->size)//如果满了,要先扩展空间
{
db->size *= 22;//新的空间大小是原来的两倍
//用realloc扩展空间
db->pData = (Student*)realloc(db->pData,db->size*sizeof(Student));
printf("%p\n",db->pData);
if(db->pData == NULL)
{
return -1;
}
}
//插入新纪录
db->pData[db->count] = stu;
db->count++;
return 0;
}
//打印数据库的内容
void printDatabase(Database* db)
{
printf("数据库的大小:%d,现有记录个数:%d\n",db->size,db->count);
printf(" 姓名 年龄 性别 数学 语文 英语\n");
for(int i=0; i<db->count; i++)
{
printf("%8s\t%2d\t%c\t%.2f\t%.2f\t%.2f\t\n",
db->pData[i].name,
db->pData[i].age,
db->pData[i].gender,
db->pData[i].score[0],
db->pData[i].score[1],
db->pData[i].score[2]);
}
}