【C语言】灵活内存管理方式(动态分配):malloc、free、calloc、realloc

        首先使用以下函数需要使用库<stdlib.h>:malloc(申请动态内存空间)、free(释放动态内存空间)、calloc(申请并初始化一系列内存空间)、realloc(重新分配内存空间)。

 malloc:原型void *malloc(size_t size):向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针,调用成功则返回一个指向申请的内存空间的指针,因为返回类型是void指针,所以可以返回任何类型的数据,失败返回NULL。malloc是从堆中分配空间而不是栈所以必须free手动释放空间。

int *p1=NULL;
p1=(int *)malloc(sizeof(int)*10);

free:原型为void free(void *p):可以释放空间,但释放的空间必须由malloc、calloc、realloc申请,若p==NULL则不执行任何操作

calloc:原型void*calloc(size_t nmemb,size_t size):动态申请nmemb个长度为size的连续内存空间,即总尺寸为nmemb*size,且全部初始化为0(也是与malloc的主要区别)

int *p1=NULL;
p1=(int *)calloc(5,sizeof(int))
/* 等价于
    p1=(int *)malloc(sizeof(int)*5);
    memset(p,0,5*sizeof(int));
*/

 realloc:原型void *realloc(void *p1,size_t size):新分配内存比原来大,则旧内存块数据不发生改变,直接复制数据到新内存。若新内存空间大小小于旧内存,则会造成数据丢失。该函数将移动旧内存空间的数据至新内存并返回新指针,地址不同与旧。成功后自动free释放原本p1的内存空间,失败则返回NULL。使用时p1必须调用malloc、calloc才可使用,或p1原本的值为NULL,则realloc相当于malloc函数

#include<stdio.h>
#include<stdlib.h>//malloc等
#include<string.h>//mem-等
#define NUM 10000
/*动态分配内存并写入数据,将其打印
输入-1时退出输入,并通过用户需求扩展内存*/
int main()
{
	int *p1=NULL;
	int *p2=NULL;
	int i,j;
	char ch;
	p1=(int *)calloc(5,sizeof(int));
	/*等价:p1=(int *)malloc(sizeof(int)*5);
	memset(p,0,5*sizeof(int));*/
	if(p1==NULL)
	{//分配失败
		printf("error\n");
		exit(1);//退出并返回1
	}
	for(i=0;i<5;i++)
	{
		printf("输入数据:\n");
		scanf("%d",&p1[i]);//&p1[i]==*(p1+i)
		if(p1[i]==-1)
		{//输入-1时退出
			break;
		}
	}
	j=i;
	printf("您目前输入的数据为:\n");
	for(i=0;i<j;i++)
	{
		printf("%d ",p1[i]);
	}
	printf("\n");
	printf("您是否想继续输入:y/n");
	printf("\n");
	getchar();
	scanf("%c",&ch);
	if(ch=='y')
	{//扩展内存空间
		p2=(int *)realloc(p1,NUM*sizeof(int));
		/*等价于 p2=(int *)calloc(10,sizeof(int));
		memcpy(p2,p1,5);
		free(p1);*/
		for(i=j;i<NUM;i++)
		{
			printf("请继续输入数据:\n");
			scanf("%d",&p2[i]);
			if(p2[i]==-1)
			{
				break;
			}
		}
		j=i;
		printf("您目前输入的数据为:\n");
		for(i=0;i<j;i++)
		{
			printf("%d ",p2[i]);
		}
		free(p2);
	}
	free(p1);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值