c语言–存储空间的分配及释放
c语言标准函数库中有malloc(),calloc(),realloc(),free() 4个函数用来实现内存的动态分配和释放,malloc()函数和free()函数最常用,下面来介绍这四个函数。
1. malloc()函数——动态分配一段内存空间
malloc()函数原型:
void*malloc(unsigned int size);
该函数包含在头文件stdlib.h中;
功能:在内存的动态存储区申请一个长度为 size 字节的连续存储空间。malloc()函数会返回一个指针,指向所分配空间的起始地址。如果没有足够的内存空间可分配,则返回空指针NULL。
其参数常使用c语言提供的类型长度运算符sizeof()来计算计算申请空间大小。
例 1 :
int *a = ( int *) malloc (sizeof( int ) ;
申请一个 int 类型长度的存储空间,并将分配到的存储空间地址转换为 int 类型地址,赋给所定义的指针变量 a ,字节数为 int 所占的空间。
例 2 :
struct stu *a = ( struct stu *) malloc (sizeof( int ));
申请可存放struct stu结构体类型数据的空间,将其地址存入指针 a 中。
例(使用malloc函数动态分配空间):
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int *a=(int *)malloc(sizeof(int));
*a=100;
printf("%d\n",*a);
return 0;
}
如果申请了一个长度为10的数组,存数是想存11个数就要对数组进行扩容:
例(数组扩容):
#include<stdio.h>
#include<stdlib.h>
int * f(int *a,int *asize)
{
int *newa=(int *)malloc(sizeof(*asize)*2);
for(int i=0;i<*asize;i++)
{
newa[i]=a[i];
}
*asize=(*asize)*2;
free(a);
return newa;
}
int main()
{
int asize=10,k=0,t;
int *a=(int *)malloc(sizeof(int)*asize);
while(scanf("%d",&t),t!=0)
{
if(k>=asize) a=f(a,&asize);
a[k]=t;
k++;
}
for(int i=0;i<k;i++)
{
printf("%d ",a[i]);
}
return 0;
}
这样就可以实时对数组进行扩容。
2.calloc()函数——动态分配连续内存空间
calloc()函数原型:
void * calloc ( unsigned int n , unsigned int size );
该函数包含在头文件stdlib.h中;
功能:在内存申请n个长度为 size 字节的存储空间,并返回该存储空间的起始地址,如果没有足够的内存空间可分配,则返回空指针NULL。
例:
int *a=(int *)calloc(10,sizeof(int));
用malloc函数实现为:
int *a=(int *)malloc(sizeof(int)*10);
3.relloc()函数——改变指针指向空间大小
relloc()函数原型:
void *realloc(void *ptr,size_t size);
该函数包含在头文件stdlib.h中;
功能:改变ptr指针指向大小为 size 的空间。返回值是一个新地址的指针,若出现错误,则返回NULL。
例 (改变一个浮点型空间大小为整型):
aFloat=(float *) malloc (sizeof(float));
bint=realloc( aFloat , sizeof( int ));
其中aFloat是指向分配的浮点型空间,然后使用 realloc() 函数改变aFloat指向空间的大小,将大小设置为整型,然后将改变后的内存空间的地址返回赋值给bint指针;
4.free()函数——释放内存空间
free()函数原型:
void free(void *p)
功能:将指针变量 p 指向的存储空间释放,交还给系统。free()函数无返回值。p只能是程序最后一次调用malloc()或calloc()函数所返回的地址。
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a;
a=(int *)malloc(size(a));
*a=100;
printf("%d\n",*a);
free(a);
printf("%d\n",*a);
return 0;
}
第一次输出为100;
第二次输出前已经调用free()函数将空间释放,数据已不存在因此输出一个随机的值。