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

}

}

时间: 2024-08-09 22:01:45

C语言:使用realloc函数对malloc或者calloc动态分配的内存大小进行扩展的相关文章

c realloc函数和malloc函数

realloc 原型:extern void *realloc(void *mem_address, unsigned int newsize); 用法:#include <stdlib.h> 有些编译器需要#include <alloc.h> 在C++环境中,使用#include<iostream> using namespace std;功能:改变mem_address所指内存区域的大小为newsize长度. 说明:如果重新分配成功则返回指向被分配内存的指针,否则返

malloc,calloc,realloc

三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函数库内 它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL 1.  malloc用于申请一段新的地址,参数size为需要内存空间的长度,如: char* p; p=(char*)mal

realloc函数引发的惨案

帮别人调试个程序,程序的功能主要涉及动态数组,实现动态数组元素的添加,删除,查找,显示功能.但是在执行添加功能的时候,连续执行三次添加的时候就会出现问题,让人感到非常的莫名其妙. 涉及到的函数如下所示: void adddata(int * arr, int * len) { int n; int *add; int cnt=0, t1; printf("pleaseenter the amount of element you want to add;\n"); scanf(&quo

malloc()与calloc差别

Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from the other. Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from

malloc()与calloc差异

Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from the other. Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from

转:安全起见,小心使用C语言realloc()函数

安全起见,小心使用C语言realloc()函数 http://www.360doc.com/content/16/0712/09/19227797_574892368.shtml 在C语言中,良好的编程习惯要求一个函数只做一件事,如果一个函数实现了若干功能,可以说基本是一个糟糕的设计. C语言 realloc() 函数位于 stdlib.h 头文件中,其原型为: void *realloc(void *ptr, size_t size); realloc() 会将 ptr 所指向的内存块的大小修

C 语言中 malloc、calloc、realloc 和free 函数的使用方法

C标准函数库中,常见的堆上内存管理函数有malloc(), calloc(), recalloc(), free(). 之所以使用堆,是因为栈只能用来保存临时变量.局部变量和函数参数.在函数返回时,自动释放所占用的存储空间.而堆上的内存空间不会自动释放,直到调用free()函数,才会释放堆上的存储空间. 一.具体使用方法 1.malloc() 头文件:stdlib.h 声明:void * malloc(int n); 含义:在堆上,分配n个字节,并返回void指针类型. 返回值:分配内存成功,返

动态分配内存函数:malloc(),calloc(),realloc(),以及memset(),free() 详细总结

以下资料大部分来源网络,个人进行了汇总和添加. 内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的,变量生命长度:函数结束即释放内存. 堆区(heap):一般由程序员分配与释放,即程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿

malloc、calloc、realloc、new以及alloca函数区别

malloc.calloc.realloc.new以及alloca函数 一.综合叙述 1) malloc 函数: void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化. 2)calloc 函数: void *calloc(unsigned int num, unsigned int size) 按照所给的数据个数和数据类型所占字节数,分配一个