随堂笔记(二)--内存分配函数

malloc

malloc()函数就是在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。

void * __cdecl malloc(_In_ size_t _Size);//函数原型
int *p =(int *)malloc(sizeof(int)*10); //内存分配
//malloc不会初始化地址内的数据,需要用户手动初始化
for(int i =0;i<10;i++)
{//初始化内存
    p[i]=i;//内存实际上就可以看成是数组。
}

在使用malloc后分配的内存大小将不会发生变化,这里要特别注意数组越界问题。

realloc

在上面我们提到了数组越界问题,这在编程中已经是典型的错误了。如果已经申请内存了,但我们又想要插入一个数据,最简单的方法就是回到malloc最初代码行,修改分配的内存的大小。但C/C++为我们提供了一种内存扩展功能,这是我们如果想要扩展malloc已分配的内存则使用函数realloc。

使用realloc扩展内存,有两种情况,一种是malloc之后的内存没有被占用,则自动向下扩展;若被占用,则重新分配地址,并拷贝原来的数据。

//情况一:地址扩展成功
//px的物理地址与p的地址相接,向下拓展
//向下的地址够用,拓展成功,可以直接插入
int *p =malloc(sizeof(int)*10);
for(int i =0;i<10;i++)
{
    p[i]=i;
} 
int *px = realloc(p,44);
p[11] = 11; 
//情况二:地址扩展失败
//向下的地址不够大,拓展失败,则重新分配的内存并将拷贝原有的数据,
//释放原来的内存
int *p_p = malloc(100);
int *px= realloc(p,200);
for(int i =10;i<50;i++)
{
    px[i]=i;
}

calloc

初始化为零,参数意义是:指针大小 ,单个元素大小

int *p = calloc(25,sizeof(int));
for(int i =0;i<25;i++)
{
    p[i]=i;
}

_recalloc

_recalloc 函数类似于realloc函数,唯一不同的是分配内存时将内存清零。
第一个参数是个数,第二个是元素大小

int *p = calloc(25,sizeof(int));
for(int i =0;i<25;i++)
{
    p[i]=i;
}
int *pp = recalloc(p,50,sizeof(int));
for(int i =25;i<50;i++)
{
    pp[i]=i;
}

malloc和realloc、calloc和_recalloc 成对使用,前者不同于后者的是前者申请或扩展内存时不会初始化内存,但后者会将内存清零。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值