C语言动态内存申请
1.malloc
- 原型:
void* malloc(size_t size)
void free(void* pointer)
说明:
- malloc分配的是一片连续的内存空间,以字节为单位,不带任何类型信息
- malloc实际分配的内存比请求的稍微多一点
- 当请求的内存无法满足时,返回NULL
- 当free的参数为NULL时,函数直接返回
示例:
int main()
{
int i = 0;
int *p1 = (int*)malloc(5 * sizeof(int)); //malloc申请内存空间
for(i = 0; i < 5; ++i)
{
/*打印申请的内存空间里的值,在windows下是随机数字,在linux下测试为0*/
printf("p1[%d] = %d\n", i, p1[i]);
}
free(p1);
return 0;
}
- 注:需要对每一次的内存申请和释放进行检查,确保不为NULL
2. calloc
- 原型:
void* calloc(size_t num_elements, size_t size)
说明:
- calloc的参数代表所返回内存的类型信息
- calloc会将返回的内存初始化为0
示例:
int main()
{
int i = 0;
int *p1 = (int*)malloc(5 * sizeof(int));
short *p2 = (short*)calloc(5, sizeof(short)); //calloc申请内存空间并初始化
for(i = 0; i < 5; ++i)
{
/*打印malloc和calloc申请的空间里的值,进行比较*/
//calloc会初始化为0
printf("p1[%d] = %d, p2[%d] = %d\n", i, p1[i], i, p2[i]);
}
free(p1);
free(p2);
return 0;
}
3.realloc
- 原型:
void* realloc(void* pointer, size_t new_size)
说明:
- realloc用来修改一个原先已经分配好的内存大小
- 在使用realloc后应该使用其返回值
- 当pointer的第一个参数为NULL时,等价于malloc
- 在扩大的内存时,原有的数据保存,新增加的添加到末尾
示例:
int main()
{
int i = 0;
int *p1 = (int*)malloc(5 * sizeof(int));
short *p2 = (short*)calloc(5, sizeof(short));
for(i = 0; i < 5; ++i)
{
printf("p1[%d] = %d, p2[%d] = %d\n", i, p1[i], i, p2[i]);
}
p1 = (int*)realloc(p1, 10); //对malloc申请的内存空间进行扩大
putchar(10);
for(i = 0; i < 10; ++i)
{
/*打印出来扩大后的内存空间的值,存放的是随机数*/
printf("p1[%d] = %d\n", i, p1[i]);
}
free(p1);
free(p2);
return 0;
}