🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
⛺️生活的理想,就是为了理想的生活!
🌈hello! 各位宝子们大家好啊,前面一章给大家带来了动态内存分配的四个函数的讲解!malloc free calloc realloc 这四个库函数不知道大家还记得吗? ⛳️动态内存分配学完了那么,这些关于内存分配的错误你就必须避免了! 📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐! ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!
🔥 注:上一章学习内容是《动态内存分配》
📚 代码演示:
void test()
{
int* p = (int*)malloc(INT_MAX / 4);
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}
⛳️ 这里我们对malloc的返回值用p接收,然后解引用进行赋值错误点在:
malloc
我们上一篇我们说了它的返回值有可能是空指针void test()
{
int* p = (int*)malloc(INT_MAX / 4);
if (p == NULL)
{
perror("calloc");
return 1;
}
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}
📚 代码演示:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int* p = (int*)malloc(10 * sizeof(int));
if (NULL == p)
{
perror("malloc");
return 1;
}
for (i = 0; i < 11; i++)
{
p[i] = i;//当i是10的时候越界访问
}
free(p);
return 0;
}
⛳️不知道大家看出来了没有,我们这里总共就申请了10个整形的空间。而调用的时候缺想访问11个整形进行赋值.
📑 代码结果:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int* p = (int*)malloc(10 * sizeof(int));
if (NULL == p)
{
perror("malloc");
return 1;
}
for (i = 0; i < 10; i++)
{
p[i] = i;//当i是10的时候越界访问
}
free(p);
return 0;
}
📌 所以解决办法也非常简单只要,我们避免就可以啦!
📚 代码演示:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 10;
int* p = &a;
free(p);//ok?
return 0;
}
⛳️free这个函数只能释放我们动态内存开辟的空间,结果你非要去栈区上释放空间
📑 代码结果:
📚 代码演示:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(100);
p++;
free(p);//p不再指向动态内存的起始位置
return 0;
}
这种情况是释放了对于属于我们开辟的内存空间,没有释放完全
内存泄漏
📑 代码结果:
📚 代码演示:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(100);
free(p);
free(p);//重复释放
return 0;
}
⛳️ 这也是写代码糊涂了才会这样,对一块内存进行多块释放!本来p的地址我们都已经释放完了你还让我释放一遍这怎么能这样呢?
📑 代码结果:
这个解决方法也非常简单,我们只要每次
free
释放完把p
置为空指针就可以了。
p
里面都是空指针,都没有存地址📚 代码演示:
#include <stdio.h>
#include <stdlib.h>
void test()
{
int* p = (int*)malloc(100);
if (NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while (1);
return 0;
}
;
⛳️ 这个情况就有点像我们看的侦查片里面的卧底,我们派了
小王
进行卧底但是只有警员阿SIR
记得小王的档案为了保密其他人都不知道,有一天 阿SIR 突然去世了,这时不就没人记得 小王的卧底身份了!
p
也就进行销毁了没人记得这⛳️那么内存泄漏有什么危害呢?这个其实很常见
内存病毒
不知道大家听说过没有?每次开机都没问题,但总是用不到多长时间就会死机!
所以一定要避免这种情况,免得以后费力吧唧的写了一个代码人家说什么鬼程序用一下就崩! 🔥 注:动态开辟的空间一定要释放,并且正确释放 。
✅ 归纳:
好了以上就是关于动态内存分配的全部注意事项就全部讲解完毕啦!
对NULL指针的解引用操作
对动态开辟空间的越界访问
对非动态开辟内存使用free释放
使用free释放一块动态开辟内存的一部分
对同一块动态内存多次释放
☁️ 好了这些就是常见动态内存分配的错误了,大家一定要避免啊!
看到这里了还不给博主扣个:
⛳️ 点赞
☀️收藏
⭐️ 关注
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。