动态内存分配:
一.步骤:
①了解需要多少内存空间(malloc后面是n个sizeof还是一个sizeof);
②利用c语言提供的动态内存分配函数来分配所需要的存储空间;
③使指针指向获得的内存空间,以便用指针在该空间内实现运算或操作;
④当使用完内存后,释放这一空间。
在进行动态分配的操作中,c语言提供了一组标准函数,定义在stdlib.h中
1) 动态存储分配函数malloc()
函数原型:
void *malloc(unsigned size);
功能:在内存的动态存储区分配一连续空间,其长度为size,若申请成功 ,则返回一个指向所分配内存空间的起始地址的指针,若申请不成功,返回NULL;
例:
动态分配n个整数的空间:
p=(int *)malloc(n*sizeof(int);
if(p==NULL){
printf("not able to allocate memory.");
exit(1);
}
例题:
输入一个整数n,然后输入n个整数,求和。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,*p,sum=0,i=0;
scanf("%d",&n);
p=(int *)malloc(n*sizeof(int));
if(p==NULL)exit;
for(i=0;i<n;i++)scanf("%d",p+i);
for(i=0;i<n;i++){
sum+=*(p+i);
}
printf("%d",sum);
free(p);
return 0;
}
注:每次动态分配都必须检查是否成功,并考虑到例外情况的处理。
2)计数动态存储分配函数 calloc()
函数原型:
void * calloc(unsigned n,unsigned size);
功能:
在内存的动态存储区分配n个连续空间,每一存储空间的长度为size,并且分配后还把存储块里全部初始化为0值。若申请成功 ,则返回一个指向所分配内存空间的起始地址的指针,若申请不成功,返回NULL;
例:
动态分配n个整数空间:
p=(int *)calloc(n,sizeof(int);
if(p==NULL){
printf("not able to allocate memory.");
exit(1);
}
3)动态存储释放函数 free()
函数原型:
void free(void *ptr);
功能:
释放有动态分配函数申请到的整块内存空间,ptr指向要释放空间的首地址。如果ptr的值是空指针,则free什么也不做。该函数无返回值。
注:
①为了保证动态存储区的有效利用,在知道某个动态分配的存储块不再用时,就应及时将它释放。
②释放后不允许再通过指针去访问已经释放的块。
示例:
free(p);
注意: malloc对所分配的存储块不做任何事情,但calloc对整个区域进行初始化。