动态内存函数

一、malloc函数

1、函数介绍

头文件:#include <stdlib.h>

void *malloc( size_t size );

如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

2、函数怎么调用

(1)申请多大自己计算;
(2)需要强转类型;
例如:int *ar=(int *)malloc (sizeof(int) *n);
(3)可能申请不成功;
需要加上:

if(NULL == p)
	{
		printf("Out Of Memory.\n");
		return;
	}

(4)必须释放空间;
例如:

free(p);//释放空间
p=NULL;//释放指针

二、free函数

1、函数介绍

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

void free (void* ptr);

free函数用来释放动态开辟的内存。

2、函数要点

1)如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
2)如果参数 ptr 是NULL指针,则函数什么事都不做。
3)释放指针和释放空间并不相同,其中释放空间只是把空间使用权进行归还,并没有释放指针。
4)一定要进行释放空间,否则会出现空间泄露的问题。

三、calloc函数

1、函数介绍

C语言还提供了一个函数叫 calloc,calloc 函数也用来动态内存分配。原型如下:

void* calloc (size_t num, size_t size);

(1)函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
(2)与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

2、函数怎么调用

函数调用与malloc相似,例如:
int *ar=(int *)calloc (0,sizeof(int));
其中,calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

四、realloc函数

realloc函数的出现让动态内存管理更加灵活。
有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。那realloc函数就可以做到对动态开辟内存大小的调整。函数原型如下∶

void* realloc (size_t num, size_t size);
2、函数怎么调用

realloc在调整内存空间的是存在两种情况:
情况1:原有空间之后有足够大的空间
情况2:原有空间之后没有足够大的空间
在这里插入图片描述
情况1
当是情况1的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
情况2 当
是情况2的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来
使用。这样函数返回的是一个新的内存地址。
例如:

#include<stdio.h>
void main()
{
	int n = 10;
	int *p = (int *)realloc(NULL, sizeof(int) *n); //malloc
	if(NULL == p)
		return;
	for(int i=0; i<n; ++i)
	{
		p[i] = i + 1;  //1 2 3 4 5 x x x x x
	}

	for(int i=0; i<n; ++i)
	{
		printf("%d ",p[i]);  //1 2 3 4 5
	}
	printf("\n");

	n = 5;
	p = (int *)realloc(p, sizeof(int) * n);
	for(int i=0; i<n; ++i)
	{
		printf("%d ",p[i]);  //1 2 3 4 5
	}
	printf("\n");

	free(p);
}

五、realloc函数

常见的动态内存错误:

1、对NULL指针的解引用操作;
2、对动态开辟空间的越界访问;
3、对非动态开辟内存使用free释放;
4、对同一块动态内存多次释放;
5、动态开辟内存忘记释放(内存泄漏)。

切记: 动态开辟的空间一定要释放,并且正确释放 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值