C语言动态内存分配
动态数据结构可以在运行时灵活添加、删除或重排数据项。在运行时分配内存空间的过程称为动态内存分配。内存分配函数如下:
malloc 分配所需的字节大小,并返回指向所分配空间的第一个字节的指针
calloc 为元素数组分配空间,并初始化为零,然后返回指向该内存的指针
free 释放前面已分配的空间
realloc 修改前面已分配空间的大小
知识点一:用malloc函数分配一块内存,如:int *x;x=(int*)malloc(100*sizeof(int));
如:char *cptr;cptr=(char *)malloc(10);如:st_var=(struct store *)malloc(sizeof(structstore));
程序一:使用一个整数表,显示其内存分配空间;
#include"stdio.h"
#include"stdlib.h"
#define NULL 0
main()
{
int*p,*table;
intsize;
printf("\n输入数据表的大小?");
scanf("%d",&size);
printf("\n");
if((table=(int*)malloc(size*sizeof(int)))==NULL) //测试所需内存大小的可用性
{
printf("没有可用的空间分配\n");
exit(1);
}
printf("\n分配的首地址是:%u\n",table); //分配空间的首地址
printf("\n输入数据表的值\n");
for(p=table;p<table+size;p++)
scanf("%d",p);
for(p=table+size-1;p>=table;p--)
printf("%d存储的地址是:%u\n",*p,p);
}
知识点二:用calloc函数分配多个内存块,calloc在运行时存储派生数据类型(如数组和结构体)而分配的存储空间。malloc分配的是单个存储块,而calloc分配的是多个存储块,每个块大小相等。
如:ptr=(类型 *)calloc(n,元素大小);
实例:
struct student
{
charname[25];
floatage;
longint id_num;
};
typedef struct student record;
record *st_ptr;
int class_size=30;
st_ptr=(record*)calloc(class_size,sizeof(record *));
//分配了30个记录的空间,每块的大小为结构体大小,它有3个成员。
确保分配空间成功,用如下判断:
if(st_ptr=NULL)
{
printf(“内存不能分配”);
exit(1);
}
知识点三:用free函数释放已用的空间,对运行的内存分配,当不再需要时,由程序员负责释放,如:free(ptr); 注意两件事:
1) 所释放的不是指针本身,而是它所指向的内容。
2) 要释放由calloc分配的内存数组,只需要释放该指针一次即可。
知识点四:用realloc函数改变内存块的大小,这个过程称为内存重新分配。例如,如果原始内存分配是用下面语句完成的:
ptr=malloc(size);
那么,就可以用下面的语句来重新分配:
ptr=realloc(ptr,newsize);
如果函数没有成功分配更多空间,将返回一个空指针,有必要测试下操作是否成功。
程序四:把一个字符串保存在由malloc创建的内存块中,然后修改它以存储更大的字符串。
#include"stdio.h"
#include"stdlib.h"
#define NULL 0
main()
{
char*buffer;
if((buffer=(char*)malloc(10))==NULL)
{
printf("mallocfailed!");
exit(1);
}
printf("bufferof size %d created\n",_msize(buffer));//大小
strcpy(buffer,"HYDERABAD"); //初始字符串
printf("\nbuffercontains:%s \n",buffer);
if((buffer=(char*)realloc(buffer,15))==NULL) //重新分配
{
printf("Realocationfailed!\n");
exit(1);
}
printf("\nbuffersize modfied.\n");
printf("\nbufferstill contains:%s \n",buffer);
strcpy(buffer,"SECUNDERBAD");//修改后的字符串
printf("\nbuffernow contains:%s \n",buffer);
free(buffer);
}