C语言动态内存分配

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

}

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值