动态分配函数
批量数据的存储
动态内存分配函数
#include <stdlib.h>
c提供下列与动态内存分配相关的函数:
void * malloc(unsigned int size);
void * calloc(unsigned int n,unsigned int size);//分配n个,每个大小为size
void *realloc(void * p_block,unsignde int size);//重新分配
void free(void * p_block);//释放
常用的malloc和free函数:
(1)malloc函数
void * malloc(unsigned int size);
向系统申请分配指定字节数的存储空间,
分配size字节存储空间,分配成功返回首地址,
分配失败返回NULL。
int i,*p=(int*)malloc(6*sizeof(int));
if(p)
for(i=0;i<6;i++) p[i]=i;
else
printf("dynamic alloc failed!")
(2)free函数
void free(void * p_block);
释放p_block指向的动态分配的存储空间。
如:free§;
一旦释放,就不能再用该指针引用存储区内的数据。
如果指针为NULL,free函数无释放操作。
注意:动态分配的存储空间一定要用free函数释放,而静态分配的存储空间当程序运行完成的时候自动释放。
int *p; //定义指针变量p
p=(int *)malloc(sizeof(int)); //分配存放整型数据的存储空间,地址赋给p
if(p == NULL) //如果内存分配不成功
{
printf(“Memory allocation failed. Googbye.\n”);
exit(1); //停止进程执行,异常退出,并清空内存及所使用的相关数据结构
}
……
free(p); //释放p所指向的存储空间
(3)calloc函数:
void * calloc(unsigned int n,unsigned int size);
向系统申请分配n项大小相同的存储空间
分配成功:返回新分配存储空间的首地址,新分配存储空间均被初始化为0;
分配失败:返回NULL
例如:int *q=(int*)calloc(6*sizeof(int));
可以替代mallocint *q=(int*)malloc(6*sizeof(int));
(如果不考虑初始化的值)
(4)realloc函数:
void *realloc(void * p_block,unsignde int size);
对指针所指向的已动态分配的存储空间重新进行动态存储分配
如果缩小空间则返回的地址是原地址;
如果是扩大空间,则有三可能:
①原空间位置足够的空间可以扩充,返回的地址与扩充前的地址相同;
②如果原位置无足够的空间,按照size指定的大小重新分配空间,将原有的数据从头到尾拷贝到新分配的内存区域,而后释放原来指针所指内存区域,同时返回新分配的内存区域的首地址;
③否则说明内存无足够的空间可以分配,分配失败,返回值为NULL。
动态数组实现的一般过程:
①定义数组元素类型(t)的指针§
②指定数组要存放的元素个数(n)
③动态申请(n*sizeof(t))大小的存储空间,并让p指向该存储空间首地址
④通过p对数组进行赋值和操作
⑤使用结束后释放数组空间