承接69.【C语言】动态内存管理(重点)(2)文章
目录
4.calloc函数
cplusplus网的翻译
提炼要点
使用
5.recalloc函数
使用说明
作用
调整内存空间的几种情况
1.原有空间之后有足够大的空间
2.原有空间之后没有足够大的空间
建议
代码
用recalloc函数来实现malloc函数
推荐阅读
4.calloc函数
cplusplus网站的介绍,点我跳转
cplusplus网的翻译
函数
calloc
void* calloc (size_t num, size_t size);
为含num个元素的数组分配内存块,每个元素有size个字节长,并且把他们的所有位初始化为0
实际结果是分配了一个num*size字节的初始化内存块,内存块的每个位为0
如果size为0,返回值依靠特定的库来实现,它可能是也可能不是一个空指针(即不确定是什么类型的指针,因为C标准没有定义),但返回的指针不应被解引用
参数
num:需要分配的num个元素
size:每个元素的大小(备注:size个字节)
size_t是无符号整型
返回值
成功时,指向内存块的指针被函数分配
指针的类型总为void*,它可以被转换为所需的数据指针类型以便解引用
如果函数不能为请求的内存块分配,则返回一个空指针
提炼要点
1.函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0
2.与malloc函数(具体见68.【C语言】动态内存管理(重点)(上))的区别只在于calloc函数会在返回地址之前把申请的空间的每个字节初始化为全0
3.使用malloc函数前加#include <stdlib.h>
4.养成良好习惯,判断是否为空指针
使用
#include <stdio.h>
#include <stdlib.h>
int main()
{
int*p=(int*)calloc(10,sizeof(int));
if (p == NULL)
{
perror("calloc");
return 1;
}
//使用
int i = 0;
for (i = 0; i < 10; i++)
printf("%d ", *(p + i));
//释放
free(p);
p = NULL;
return 0;
}
int*p=(int*)calloc(10,sizeof(int));如果以int形式开辟空间要用sizeof(int);即开辟10个4字节
把int*p=(int*)calloc(10,sizeof(int));改为int*p=(int*)malloc(10*sizeof(int));
因为没有初始化为0,而在内存中的字节数组为cd cd cd cd cd cd cd cd......
5.recalloc函数
void* realloc (void* ptr, size_t size);
使用说明
1.ptr是要调整的内存地址
2.size调整之后新大小
3.返回值为调整之后的内存起始位置
4.这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
作用
为了合理的使用内存,可以对内存的大小做灵活的调整
调整内存空间的几种情况
1.原有空间之后有足够大的空间
此时直接在原有空间之后增大空间
2.原有空间之后没有足够大的空间
此时recalloc按4步处理
1.在堆空间上找到新满足大小的连续空间
2.将旧空间的数据迁移到新空间
3.旧空间的内容被释放
4.返回新空间的地址
建议
1.在第4步时,建议不要用原来的指针来接收新空间的地址,如果开辟新空间失败,则会返回空指针,
一旦原来的指针被赋为空指针,则原来的指针数据会被丢失
2.释放内存空间)(free(p);)时建议为p置NULL
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int*p=(int*)malloc(10);
if (p == NULL)
{
perror("mcalloc");
return 1;//开辟失败,错误返回
}
//使用......
//扩大为20个字节
int* r_p=(int*)recalloc(p, 20);//新设一个r_p(全称recalloc_pointer)指针,
if (r_p != NULL)
{
p = r_p;
}
else
{
perror("recalloc");
return 1;//错误返回
}
//最后释放空间
free(p);
p = NULL;
return 0;
}
用recalloc函数来实现malloc函数
将recalloc函数的第一个参数设为NULL就等同malloc函数
如recalloc(NULL,5);等同于malloc(5);
推荐阅读
68.【C语言】动态内存管理(重点)(1)