静态分配
- 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。
- 必须事先知道所需空间的大小。
- 分配在栈区或全局变量区,一般以数组的形式。
- 按计划分配。
动态分配
- 在程序运行过程中,根据需要大小自由分配所需空间。
- 分配在堆区,一般使用特定的函数进行分配。
- 按需分配。
动态分配内存空间函数
1.分配内存空间函数 malloc
• 函数原型:void *malloc(unsigned int num_types);
• 调用形式:(类型说明符 *) malloc(size)
• 功能描述:
• 在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。
• 函数原型返回void *指针,使用时必须做相应的强制类型转换。
• 返回值
分配成功:返回调用空间的起始地址。
分配失败:返回NULL。
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { int count,*array,n; printf("请输入要申请数组的个数:"); scanf("%d",&n); array = (int *)malloc(n * sizeof(int)); if(array == NULL) { printf("申请空间失败\n"); return-1; } memset(array,0,n * sizeof(int)); //将申请到的空间清0 for(count = 0;count < n;count++) //给数组赋值 { array[count] = count; } for(count = 0;count < 0;count++) //打印数组元素 { printf("%2d",array[count]); } free(array); return 0; }
2.分配内存空间。函数 calloc
• 调用形式:(类型说明符 *) calloc(n,size)
• 功能描述:
在内存的动态存储区(堆区)中分配n块长度为size字节的连续区域。
• 返回值
该区域的首地址。
• calloc和malloc的区别:
• calloc能一次分配n块连续区域。
• calloc能对分配的空间初始化为0,而malloc不能,须用memset()或bzero()函数来初始化。
#include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { int count,*array,n; printf("请输入要申请空间的个数:"); scanf("%d",&n); array = (int *)calloc(n,sizeof(int)); if(array == NULL) { printf("申请空间失败\n"); return -1; } for(count = 0;count < n;count++) //给数组赋值 array[count] = count; for(cpunt = 0;count < n;count++) //打印数组元素 printf("%2d",array[count]); free(array); return 0; }
3.分配内存空间函数 realloc(内存追加)
• 原型:void *realloc(void *mem_address,unsigned int newsize);
• 调用形式:指针名 = (数据类型 *)realloc(要改变大小的指针,新的大小); //新的大小:追加后总的大小
• 功能说明:
• 判断当前的指针后面是否有足够的连续空间,如果有,扩大mem_address指向的地址并且将mem_address返回。
• 若空间不够先按照newsize指定的大小分配空间,将原有数据拷贝到新分配的内存区域,而后释放原来。
• 返回值:
返回新分配的内存区域的首地址。
#include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { int i; int *pn = (int *)malloc(5 * sizeof(int)); for(i = 0;i < 5;i++) scanf("%d",&pn[i]); pn = (int *)realloc(pn,10 * sizeof(int)); for(i = 5;i < 10;i++) scanf("%d",&pn[i]); for(i = 0;i < 10;i++) printf("%2d",pn[i]); free(pn); return 0; }
4.释放内存空间函数 free
• 调用形式:free(void *ptr);
• 功能描述:
释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。
• 使用说明:
• 被释放区域应是由malloc、calloc、realloc函数分配的区域。
• 不释放可能造成内存利用率降低。
• 对同一内存空间对此释放会出错。