文章转自: http://c.biancheng.net/c/
1. 动态内存分配函数
堆(Heap)
是唯一由程序员控制的内存区域,我们常说的动态内存分配也是在这个区域。在堆上分配和释放内存需要用到C语言标准库中的几个函数:malloc()
、calloc()
、realloc()
和 free()
。
1.1 malloc()
原型:void* malloc (size_t size);
作用:在堆区分配 size 字节的内存空间.
返回值:成功返回分配的内存地址,失败则返回NULL.
注意:分配内存在动态存储区(堆区),手动分配,手动释放,申请时空间可能有也可能没有,需要自行判断,由于返回的是void,需要手动强制类型转换*。
1.2 calloc()
原型:void* calloc(size_t n, size_t size);
功能:在堆区分配 n*size 字节的连续空间.
返回值:成功返回分配的内存地址,失败则返回NULL.
注意:calloc()
函数是对 malloc()
函数的简单封装,参数不同,使用时务必小心,第一参数是第二参数的单元个数,第二参数是单位的字节数。
1.3 realloc()
原型:void* realloc(void *ptr, size_t size);
功能:对 ptr 指向的内存重新分配 size 大小的空间,size 可比原来的大或者小.
返回值:成功返回更改后的内存地址,失败则返回NULL.
1.4 free()
原型:void free(void* ptr);
功能:释放由 malloc()、calloc()、realloc() 申请的内存空间。
每个内存分配函数必须有相应的 free
函数,释放后不能再次使用被释放的内存。
在分配内存时最好通过判断数据类型长度的操作符 sizeof
来指定内存空间的大小,而不要用数字来表示内存大小,这样利于程序的移植
sizeof
是一个单目操作符,不是函数,用以获取数据类型的长度时必须加括号,例如 sizeof(int)、sizeof(char) 等。
最后是一个综合的示例:
#include <stdio.h>
#include <stdlib.h>
#define N (5)
#define N1 (7)
#define N2 (3)
int main()
{
int *ip;
int *large_ip;
int *small_ip;
if((ip = (int*)malloc(N * sizeof(int))) == NULL)
{
printf("memory allocated failed!\n");
exit(1);
}
int i;
for(i = 0; i < N; i++)
{
ip[i] = i;
printf("ip[%d] = %d\t", i, ip[i]);
}
printf("\n");
if((large_ip = (int* )realloc(ip, N1 * sizeof(int))) == NULL)
{
printf("memory allocated failed!\n");
exit(1);
}
for(i = N; i < N1; i++)
large_ip[i] = 9;
for(i = 0; i < N1; i++)
printf("large_ip[%d] = %d\t", i, large_ip[i]);
printf("\n");
if((small_ip = (int*)realloc(large_ip, N2 * sizeof(int))) == NULL)
{
printf("memory allocated failed!\n");
exit(1);
}
for(i = 0; i < N2; i++)
printf("small_ip[%d] = %d\t", i, small_ip[i]);
printf("\n");
free(small_ip);
small_ip = NULL;
system("pause");
return 0;
}
运行结果:
ip[0] = 0 ip[1] = 1 ip[2] = 2 ip[3] = 3 ip[4] = 4
large_ip[0] = 0 large_ip[1] = 1 large_ip[2] = 2 large_ip[3] = 3 large_ip[4] = 4 large_ip[5] = 9 large_ip[6] = 9
small_ip[0] = 0 small_ip[1] = 1 small_ip[2] = 2
代码首先分配一个包含5个整型的内存区域,分别赋值0到4;再用realloc
函数扩大内存区域以容纳7个整型数,对额外的两个整数赋值为9;最后再用realloc
函数缩小内存区域,直接输出结果(因为realloc函数会自动复制数据)。