【C语言】解析动态内存分配函数——malloc()函数、calloc()函数、realloc()函数

CSDN话题挑战赛第2期
参赛话题:学习笔记


目录

 前言

1.malloc()函数

函数参数

 函数使用实例

2.calloc()函数 

 函数参数

函数使用实例 

3.reaclloc()函数

函数参数 

 函数使用实例


 前言

动态内存和使用静态内存的对比:

   静态内存空间开辟大小是固定的建立在栈上,不管用多少都会开辟指定大小,并且无法释放;反观动态内存空间开辟在堆上,不管开辟多少,最终会释放。


头文件:stdlib.h


注:C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型

void free (void* ptr);

1.malloc()函数

函数参数

开辟一个大小位size(字节)的连续空间,若开辟成功返回类型是一个无符号类型的指针,若开辟不成功就返回空指针(NULL)。

void* malloc (size_t size);

 函数使用实例

include <stdio.h>
int main()
{
 int* ptr (int*)malloc(40);
 if(NULL != ptr)//判断ptr指针是否为空
 {
     int i = 0;
     for(i=0; i<10; i++)
     {
     *(ptr+i) = 0;
     }
 }
 free(ptr);//释放ptr所指向的动态内存
 ptr = NULL;
 return 0;
}

2.calloc()函数 

 函数参数

函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0,若开辟成功返回类型是一个无符号类型的指针,若开辟不成功就返回空指针(NULL)。

该函数相当于malloc()函数+memset()函数的结合体。

void* calloc (size_t num, size_t size);

函数使用实例 

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int *p = (int*)calloc(10, sizeof(int));
 if(NULL != p)
 {
     int i = 0;
     for(i=0; i<10; i++)
     {
     *(p+i) = 0;
     }

}
 free(p);
 p = NULL;
 return 0;
}

 

3.reaclloc()函数

函数参数 

将ptr指到的地方扩大(缩小)到size大小。

返回值为调整之后的内存起始位置。

void* realloc (void* ptr, size_t size);

 该函数使用时有两者情况:

情况一:原有空间之后有足够大的空间

要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。

情况二:原有空间之后没有足够大的空间

原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。 由于上述的两种情况,realloc函数的使用就要注意一些。

 函数使用实例

#include <stdio.h>
int main()
{
 int *ptr = (int*)malloc(100);
 if(ptr != NULL)
 {
     //业务处理
 }
 else
 {
     return 1;    
 }
 //扩展容量
 //代码1
 ptr = (int*)realloc(ptr, 1000);
 
 //代码2
 int*p = NULL;
 p = realloc(ptr, 1000);
 if(p != NULL)
 {
 ptr = p;
 }
 //业务处理
 free(ptr);
 return 0;
}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃大白菜  

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值