【动态内存】

目录

一、动态内存分配

1)malloc函数

2)calloc函数

3)realloc函数

4)free函数


一、动态内存分配

头文件:stdlib.h

1)malloc函数

malloc函数:malloc(int size)

用于分配一个大小为size的内存区域。申请的是字节,100则可以存放25个整数

例如:char* p=(char*)malloc(100)

#include<stdio.h>
int main()
{
	//int* p = (int*)malloc(100);
	//或者如下申请内存
	int* p = (int*)malloc(25 * sizeof(int));
	*p = 10;
	*(p + 1) = 20;
	printf("%d\t", *p);
	printf("%d\t", *(p + 1));

	//[]也有解引用的作用p[0]等于*p
	printf("%d\t%d", p[0], p[1]);

}

2)calloc函数

calloc函数:calloc(unsigned n,int size)

用于分配n个大小为size的连续内存区域,可以为一维数组开辟动态内存空间

例如:int* p=(int*)calloc(10,sizeof(int));

int* p = (int*)calloc(5, sizeof(int));//会默认初始化地址为0
	for (int i = 0; i < 5; i++)
	{
		printf("%d\t", *(p+i));
	}
	//后增加的内存不会默认初始化
	realloc(p, 5 * sizeof(int));//增加5个内存 int字节数为4
	for (int i = 0; i < 10; i++)
	{
		printf("%d\t", *(p + i));
	}
	

3)realloc函数

不会初始化内存数据

realloc函数:realloc(void* p,unsigned int size)

用于改变已经通过malloc函数或calloc函数开辟的内存空间的大小

例如:realloc(p,50*sizeof(int))

注意:会更改覆盖扩容的地址的原有值。

int* p = (int*)calloc(5, sizeof(int));//会默认初始化地址为0
	for (int i = 0; i < 5; i++)
	{
		printf("%d\t", *(p+i));
	}
	//后增加的内存不会默认初始化
	realloc(p, 5 * sizeof(int));//增加5个内存 int字节数为4
	for (int i = 0; i < 10; i++)
	{
		printf("%d\t", *(p + i));
	}

4)free函数

free函数:void free(void* p)

用于释放指针变量所指的动态内存空间

例如:free(p);

int* p = (int*)calloc(5, sizeof(int));//会默认初始化地址为0
	for (int i = 0; i < 5; i++)
	{
		printf("%d\t", *(p+i));
	}
	//后增加的内存不会默认初始化
	realloc(p, 5 * sizeof(int));//增加5个内存 int字节数为4
	for (int i = 0; i < 10; i++)
	{
		printf("%d\t", *(p + i));
	}
	free(p);

二、内存扩容

#include<stdio.h>
int main()
{
	int* p = (int*)malloc(10 * sizeof(int));//分配初始内存
	for (int i = 0; i < 10; i++)
	{
		p[i] = i + 1;
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d\t",p[i]);
	}
	int* q = (int*)malloc(20 * sizeof(int));//增加内存
	//将旧内存p的数据保存到新的内存q上
	for (int i = 0; i < 10; i++)
	{
		q[i]=p[i];
	}
	free(p);//释放的不是指针变量p 释放指针变量p指向的内存
	//令p指向的新的内存
	p = q;
	for (int i = 10; i < 20; i++)
	{
		p[i] = i + 1;
	}
	for (int i = 0; i < 20; i++)
	{
		printf("%d\t",p[i]);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雨焰翎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值