动态内存分配

动态内存函数:malloc和free(都声明在stdlib.h头文件中)

malloc函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

void* malloc(size_t size);//malloc的使用

1.如果开辟成功,则返回一个指向开辟好的指针。

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

3.返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。比如:你想开辟一个整形空间,你需要把malloc强制类型转换一下(在它前面加个(int*))

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

free函数专门用来做动态内存的释放和回收的

void free(void* ptr);//free的使用

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

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

这两个函数的联合使用如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
	//向内存申请10个整形的空间 
	int *p=(int*)malloc(10*sizeof(int));
	if(p==NULL)
	{
		//打印错误原因的一个方式  
		printf("%s\n",strerror(errno));
	}
	else
	{
		//正常使用空间 
		int i=0;
		for(i=0;i<10;i++)
		{
			*(p+i)=i;
		} 
		for(i=0;i<10;i++)
		{
			printf("%d ",*(p+i));
		}
	}
	//当动态申请的空间不再使用时
	//就应该还给操作系统 
	free(p);
	p=NULL;//不将p赋予空指针的话,p还是能找到这个空间
	return 0;
}

calloc函数

void* calloc(size_t num,size_t size);//calloc的使用

1.函数功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0。

2.与函数malloc的区别只在于calloc会在返回地址之前把申请的空间的每个字节初始化为0。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
	int* p=(int*)calloc(10,sizeof(int));
	if(p==NULL)
	{
		printf("%s\n",strerror(errno));
	}
	else
	{
		int i=0;
		for(i=0;i<10;i++)
		{
			printf("%d ",*(p+i));
		}
	}
	free(p);
	p=NULL;
	return 0;
}

realloc函数

realloc函数的出现让动态内存管理更加灵活。  有时我们发现过去申请的空间太小了或者太大了,realloc函数就可以做到对动态开辟内存大小的调整。

void* realloc(void* ptr,size_t size);//realloc的使用

ptr是要调整的内存地址                   

size调整之后的新大小

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

这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间

realloc在调整内存空间的时候存在两种情况:1.原有空间之后有足够大的空间,则直接追加,后返回。2.原有空间之后没有足够大的空间,则realloc函数会重新找一个新的内存区域,开辟一块满足需求的空间,并且把原来内存中的数据拷贝回来,释放旧的内存空间,最后返回新开辟的内存空间地址。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
	int *p=(int*)malloc(20);
	if(p==NULL)
	{
		printf("%s\n",strerror(errno));
	}
	else
	{
		int i=0;
		for(i=0;i<5;i++)
		{
			*(p+i)=i;
		} 
	}
	int *ptr=(int*)realloc(p,40);
	if(ptr!=NULL)
	{
		p=ptr;
		int i=0;
	    for(i=5;i<10;i++)
        {
	    	*(p+i)=i;
	    }
	    for(i=0;i<10;i++)
    	{
	    	printf("%d ",*(p+i));
	    } 
	}
	free(p);
	p=NULL;
	return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值