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

}

}

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

  1. 【转】【C/C++】内存分配函数:malloc,calloc,realloc,_alloca

    转自:http://www.cnblogs.com/particle/archive/2012/09/01/2667034.html#commentform malloc: 原型:extern voi ...

  2. malloc,calloc,realloc函数用法,原理及不同解析

    https://blog.csdn.net/lixungogogo/article/details/50887028 一.malloc malloc在MSDN中原型为: void *malloc( s ...

  3. malloc()函数,calloc()函数,realloc()函数,free()函数

    malloc()函数 头文件:#include <stdlib.h> malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size); [参数 ...

  4. malloc,calloc,realloc,alloc

    三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(si ...

  5. malloc()与calloc差别

    Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...

  6. malloc()与calloc区别 (转)

    另外说明: 1.分配内存空间函数malloc 调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域.函数的 ...

  7. malloc()与calloc区别【转】

    转自:http://blog.csdn.net/firecityplans/article/details/4490124/ 版权声明:本文为博主原创文章,未经博主允许不得转载. Both the m ...

  8. malloc()与calloc差异

    Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...

  9. C语言的本质(25)——C标准库之内存管理

    程序中需要动态分配一块内存时怎么办呢?我们可以定义一个缓冲区数组,但是这种方法不够灵活,C89要求定义的数组是固定长度的,而程序往往在运行时才知道要动态分配多大的内存,例如: void foo(cha ...

随机推荐

  1. 《Android源码设计模式》--享元模式

    No1: 享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享.避免创建过多对象的效果,这样一来就可以提升性能.避免内存 ...

  2. FILE operattion

    #include "mainwindow.h"#include "ui_mainwindow.h"#include <QMessageBox>#in ...

  3. linux 下nginx安装

    一.一键安装四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 二.创建一个安装目录,并下载nginx安装 ...

  4. CSUOJ 1021 组合数末尾的零 二进制

    Description 从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数.组合数的计算公式如下: C(m, n) = m!/((m - n)!n! ...

  5. Ajax与传统Web开发的区别

    基本概念 1.1,Ajax AJAX:即“Asynchronous Javascript And XML”(异步的JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,尤其是在一种 ...

  6. dSploitzANTI渗透教程之启动zANTI工具

    dSploitzANTI渗透教程之启动zANTI工具 启动zANTI工具 [示例1-2]下面将介绍启动zANTI工具的方法.具体操作步骤如下所示: (1)在Android设备的应用程序界面,选择并启动 ...

  7. 1go基本语法

    // week1 project main.go//导入一个包(目录) package main //导入方法 import "fmt" //createMessage函数(参数, ...

  8. 基于ONVIF协议的摄像头开发总结

    <什么是ONVIF协议>     2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共同成立一个国际开放型网络视频产品标准网络接口开发论坛,取名为 ...

  9. 【转】高效率编辑器VIM

    最近实习的时候需要在服务器上做Debug,不得不用到vim的相关操作.以前对vim这种被码农无数赞扬的神器望而却步,但今天试了之后感觉还是不错的.以后争取少用鼠标,少用insert模式. 这是从网上看 ...

  10. 「HNOI2018」毒瘤

    「HNOI2018」毒瘤 解题思路 先考虑只有一棵树的情况,经典独立集计数. \[ dp[u][0]=\prod (dp[v][0]+dp[v][1]) \\ dp[u][1]=\prod dp[v] ...