动态内存分配

关于动态内存分配的理解

1.动态内存使用结束释放的是空间,而不是p,pc这些指针;

在动态通讯录的版本中,进行扩容的过程中,会判断一下relloc重新申请空间是否申请成功,如下面的代码

void CheckCapacity(Contact* pc)//判断一下relloc重新申请空间是否申请成功,成功则返回地址,失败返回null
{
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
        //设置临时局部指针变量ptr来接收重新申请的空间来判断是否申请成功,
        //若不设置ptr,万一申请失败,返回null,那么pc->data = null,则会找不到以前malloc得到的地址,从而无法进行free,造成内         //存泄漏
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
		}
		else
		{
			perror("AddContact");
			printf("增加联系人失败\n");
			return;
		}
	}
}

//动态版本- 增加联系人
void AddContact(Contact* pc)
{
	//考虑增容
	CheckCapacity(pc);
	//增加一个人的信息
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("增加成功\n");
}


//最后结束释放内存
void DestoryContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}

为什么在free的时候只freepc->data = NULL,而在void CheckCapacity(Contact* pc)创建的ptr没有进行free?

​因为free的是内存空间,而不是指针,在void CheckCapacity(Contact* pc)创建的ptr变量是临时变量,它是创建在栈区上的,出了这个函数它就销毁了,只要我们在此函数中不对ptr指针进行任何操作,它就不会有任何作用。

​所以最后只需free这个pc->data = NULL就可以了。

总结:动态内存分配使用完进行释放的是内存空间,而不是p,pc这些指针。

2.一道有关内存动态分配的题目
#include <string.h>
#include <stdio.h>
/*
str传给GetMemory函数的时候是值传递,所以GetMemory函数的形参p是str的一份临时拷贝。
在GetMemory函数内部动态申请空间的地址,存放在p中,不会影响外边str,所以当GetMemory函数返回之后,str依然是NULL。所以strcpy会失败。

当GetMemory函数返回之后,形参p销毁,使得动态开辟的100个字节存在内存泄漏。无法释放。
*/
void GetMemory(char* p)
{
	p = (char*)malloc(100);
}
void Test(void)
{
	char* str = NULL;
    //想让str指向malloc的空间,我们必须传str的地址进去,进函数之后*str得到str,然后就可以让str指向malloc的空间;
    //以前的char* a=&i传到函数的时候,改变的都是i的值,所以传的时i的地址;所以,想在函数中改变谁的值,就必须把谁的地址传过去, //以此得到了  “改2” 的方法
	GetMemory(str);
	strcpy(str, "hello world");
	printf(str);
}

int main()
{
	Test();
	return 0;
}

//改:1
char* GetMemory(char* p)
{
	p = (char*)malloc(100);
	return p;
}
void Test(void)
{
	char* str = NULL;
	str = GetMemory(str);
	strcpy(str, "hello world");
	printf(str);//?
	//printf("hello world");//char *p = "hello world";
	free(str);
	str = NULL;
}
int main()
{
	Test();
	return 0;
}

//改2
void GetMemory(char** p)
{
	*p = (char*)malloc(100);
}
void Test(void)
{
	char* str = NULL;
	GetMemory(&str);

	strcpy(str, "hello world");
	printf(str);
	free(str);
	str = NULL;
}

int main()
{
	Test();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值