关于动态内存分配的理解
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
的时候只free
了pc->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;
}