16-动态内存有关的相关函数

1.动态内存(在堆内存分配,堆很大,超过1G):
①根据变量定义数组的长度
②需要较大的内存
③需要长时间(即突破函数的限制)的使用内存
2.动态内存常用的四个函数:
①malloc:申请动态内存
标准形式:int *p = (int )malloc(nsizeof(int));
②calloc: 默认所有的元素置0
标准形式:int *p = (int *)calloc(n,sizeof(int));
③realloc:扩容
标准形式:int *p = (int *)realloc(p,sizeof(int));
④free:释放动态内存,不释放会出现内存泄漏
标准形式:free§;
3.内存泄漏很麻烦(在工作中也是一件很麻烦的事情):
①很难发现
②很难找
4.泄漏的内存被回收的情况:
①程序(进程)结束
②关机
5.void的用法:
①void :没有,主要修饰返回值,表示没有返回值
②void *:通用指针(可以代替任何一个指针),没有类型信息,仅仅标记地址
6.在创建动态内存后,p就可以当数组使用
int main(void)
{
	int n = 10;
	//size_t;//等同于unsigned int;
	//int arr[n];//C99,VS不支持
	int *p = (int *)malloc(n*sizeof(int));//n个int单元  ,p当作数组使用
	assert(p != NULL);
	if(p == NULL)
		return 0;
	for(int i=0;i<n;i++)//p当作数组使用
	{
		p[i] = i+1;
	}
	for(int i=0;i<n;i++)//输出p
	{
		printf("%d\n",p[i]);
	}

	return 0;
}
7.如何创建一个n个长度的double数组
int main()
{
	int n;
	scanf("%d",&n);
	//创建n个长度的double数组
	double *p = (double *)malloc(n*sizeof(double));
	assert(p != NULL);
	if(p == NULL)
		return 0;
	//...
	return 0;
}
8.验证动态内存的大小(结果可以显示"成功了")
int main()
{
	//char arr[1024*1024];//1M
	char *arr = (char *)malloc(1024*1024*1020*sizeof(char));
	assert(arr != NULL);
	printf("成功了\n");
	getchar();
	return 0;
}
9.不能用定义str[]数组,然后返回str地址的形式,因为函数已结束,局部变量就被收回了,这时所指向的地址保存的内容就不是想要的内容了
char *GetMemory()
{
	//char str[] = "hello world";//生命周期,error
	char *str = (char *)malloc(100*sizeof(char));
	strcpy(str,"hello world");
	return str;
}

int main()
{
	char *p = GetMemory();
	printf("%s\n",p);
	free(p);

	return 0;
}
10.calloc的应用:
int main()
{
	int n = 10;
	//定义n个长度的int内存,且把每个元素置0
	//int *p = (int *)malloc(n*sizeof(int));//0xcd
	//assert(p != NULL);
	//for(int i=0;i<n;i++)
	//{
	//	p[i] = 0;
	//}
	//上面所有的代码,等同calloc
	int *p = (int *)calloc(n,sizeof(int));
	for(int i=0;i<n;i++)
	{
		printf("%d ",p[i]);
	}
	
	return 0;
}
11.realloc的应用:
如果内存不足,需要更大的内存:
①申请更大的内存(买个更大的房)
②迁移数据(搬家)
③释放原来的内存(卖旧房)
④更新地址(变更家庭地址)
int main()
{
	int n = 10;
	int *p = (int *)malloc(n*sizeof(int));
	assert(p != NULL);
	//模拟p的使用
	for(int i=0;i<n;i++)
	{
		p[i] = i;
	}
	//内存不足,需要扩大内存(扩大为原来的2倍,即2n)

	
	//1.申请更大的内存(买个更大的房)
	int *q = (int *)malloc(2*n*sizeof(int));
	assert(q != NULL);
	//2.迁移数据(搬家)
	for(int i=0;i<n;i++)
	{
		q[i] = p[i];
	}
	//3.释放原来的内存(卖旧房)
	free(p);
	//4.更新地址(变更家庭地址)
	p = q;   q = NULL;

	free(p);
	free(q);
	
	//上面所有的代码,等同realloc
	printf("%d\n",p);
	//p = (int *)realloc(p,2*n*sizeof(int));
	p = (int *)realloc(p,n/2*sizeof(int));//缩小内存
	printf("%d\n",p);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值