看完秒懂malloc、calloc、realloc函数的使用

前言

        我们都知道,C语言兼具高效性、灵活性、可移植性等特点,C语言的高效性指编译器将源代码编译成机器码,提高了程序的运行效率;可移植性指C程序可以在不同的操作系统和硬件平台运行,那么C语言的灵活性是怎么体现出来的呢?实际上C语言的灵活性是指,程序员可以通过C语言直接控制内存地址和数据类型。那么C语言是如何实现对内存的操作呢?这就不得不介绍我们今天要讨论的主角:malloc、calloc、realloc函数了。

为什么要有动态内存分配?

        在讨论动态内存管理之前,我想请问有哪几种开辟内存的方式呢?事实上,C语言为了们提供了char、short、int等关键字以及与之匹配的数组的形式,他们开辟的空间都是在内存的栈区,而且开辟的空间大小都是固定的,如果空间不够后续想要扩容就会比较麻烦,为了解决这个问题,C语言提供了malloc、calloc、realloc函数让程序员可以自己申请和释放空间,从而增加了C语言了灵活性。他们包含在stdlib.h的文件中

一、malloc

函数原型如下:

void* malloc (size_t size);

作用:向内存的堆上申请一块连续可用的空间,并返回指向这块空间的指针

需要注意的是:

1.如果开辟成功,则返回指向这块空间的指针;

2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要检查;

3.函数的返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候要使用者自己来决定;

4.如果参数size参数是0,malloc的行为是标准未定义的,取决于编译器

根据上述注意事项,我们来使用malloc:

int*p=(int*)malloc(10*sizeof(int));

分析上述代码:意思是,我们向内存开辟了一块40个字节大小的空间,并返回int类型的指针p。

二、free 

        malloc、calloc、realloc都是在内存的堆上开辟空间,如果不及时释放则会存在内存泄漏的问题,因此我们需要通过free函数对开辟的空间进行释放回收。

函数原型如下:

void free (void*ptr);

作用:释放动态开辟的内存

值得注意的是:

1.如果参数ptr指向的空间不是动态开辟的,那么free函数的行为是未定义的;

2.如果参数ptr是NULL指针,则函数什么事都不用做;

3.声明在stdlib.h头文件中

使用方法如下:

int main()
{
	int* p = (int*)malloc(10 * sizeof(int));
	if (NULL != p)
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			*(p + i) = i;
		}
	}
	free(p);
	p = NULL;
	return 0;
}

二、calloc

        malloc开辟的空间没有初始值,与malloc不同的是,calloc开辟的空间初始值被赋值为0。函数原型如下:

void* calloc (size_ num,size_t size);

作用:为num个大小为size的元素开辟一块空间,并且把每个字节初始化为0

使用方法如下:

三、realloc

       我们在使用malloc、calloc函数时有时候我们把空间申请小了,有时候又把空间申请大了,为了合理的分配内存,我们通过realloc函数对内存的大小做出一定的调整,realloc函数的出现让动态内存管理更加灵活。

函数原型如下:

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

作用:调整原内存空间的大小

值得注意的是:

1.ptr是要调整的内存地址;size是调整之后的新大小;

2.返回值为调整之后的起始位置;

3.如果原有空间之后有足够大的空间,则直接在原有内存之后追加空间;如果原有内存之后没有足够大的空间,则在堆上另找一个合适大小的连续空间来使用,并返回新内存地址的起始位置

使用方法如下:

int main()
{
	int* p = (int*)calloc(10,sizeof(int));
	p = (int*)realloc(p, 1000);
	free(p);
	p = NULL;
	return 0;
}

以上就是本文的全部内容,受限于博主的知识水平,可能文章中有些许不足,欢迎大家指正。如果本文对您有帮助的话记得点赞收藏加关注,您的点赞就是对我最大的鼓励。

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱编码的傅同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值