在上一节的内容中,我们初步学习了有关动态内存
的有关内容,但是在使用上实际上还有很多的细节问题,今天我们将继续对该部分的内容进行学习,好了,话不多说,开整!!!
动态内存使用前的准备
在上一节的内容中,我们在向栈区申请完空间之后,就直接进行了空间的使用,但是显然我们忽略了一个问题:那就是内存中的栈区还有这么大的地方给你吗?
因此,
在申请完后见之后,我们要判断是否申请成功,然后再进行使用
如何判断向栈区空间申请是否成功呢,很简单,如果没有申请成功,那么他肯定就会还
给我一个空指针
,因此,只需判定返回的指针是否为空即可
。
在不为空的情况下进行使用,如果为空,我们打印错误信息,打印错误信息的函数为strerror
。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int* p = (int*)malloc(5*sizeof(int));
int i = 0;
if(p == NULL)
{
printf("%s",strerror(errno));
}
else
{
for(i=0;i<5;i++)
{
*(p+i) = i;
printf("%d ",*(p+i));
}
}
return 0;
}
这样就比较严谨了,但仍没有达到最严谨的地步。
动态内存的释放
为什么在上述内容说代码还是不是特别严谨呢,你想:我们向内存中申请了空间,咋你不还给人家换回去了????
俗话说:有借有还,再借不难,因此,我们在使用后,需要对申请的内存进行释放
,释放也很简单,使用函数free
即可,在释放完成后
,再将其置空
,则完美了。
为什么要置空呢,因为如果不置空,只是单纯的释放该指针,该指针会扔指向该地址
:
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int* p = (int*)malloc(5*sizeof(int));
int i = 0;
if(p == NULL)
{
printf("%s",strerror(errno));
}
else
{
for(i=0;i<5;i++)
{
*(p+i) = i;
printf("%d ",*(p+i));
}
}
free(p);
return 0;
}
调试查看结果:
未释放内存前:
释放内存后:
而在置空之后
,在free后加入p = NULL,才真正将该指针销毁
:
总结
因此,在动态内存使用时应该注意:
1、使用前判断是否申请成功
;
2、使用后,释放该指针指向的内存空间
那么上述程序最为规范严谨的代码应该为:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int* p = (int*)malloc(5*sizeof(int));
int i = 0;
if(p == NULL)
{
printf("%s",strerror(errno));
}
else
{
for(i=0;i<5;i++)
{
*(p+i) = i;
printf("%d ",*(p+i));
}
}
free(p);
p = NULL;
return 0;
}
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!