【C语言进阶篇】常见动态内存分配的这六个错误你必须避免!

简介: 【C语言进阶篇】常见动态内存分配的这六个错误你必须避免!

前言

  🌈hello! 各位宝子们大家好啊,前面一章给大家带来了动态内存分配的四个函数的讲解!malloc free calloc realloc 这四个库函数不知道大家还记得吗?

  ⛳️动态内存分配学完了那么,这些关于内存分配的错误你就必须避免了!

  📚本期文章收录在《C语言进阶篇》,大家有兴趣可以看看呐

  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

🔥 注:上一章学习内容是《动态内存分配》

💬 常见的动态内存错误

1️⃣ 对NULL指针的解引用操作

📚 代码演示:

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);
}

2️⃣ 对动态开辟空间的越界访问

📚 代码演示:

#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个整形进行赋值.

  • 这不就造成了越界访问,只申请了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;
}

📌 所以解决办法也非常简单只要,我们避免就可以啦!

3️⃣ 对非动态开辟内存使用free释放

📚 代码演示:

#include <stdio.h>
#include <stdlib.h>
int  main()
{
  int a = 10;
  int* p = &a;
  free(p);//ok?
  return 0;
}

⌨️ 错误原因

⛳️free这个函数只能释放我们动态内存开辟的空间,结果你非要去栈区上释放空间

  • 这种代码一般是我们喝醉了才会这样用😂😂😂
  • 开个玩笑哈!
  • 注:关于free函数和栈区我们在动态函数时有详细讲解!《动态内存详细讲解》

📑 代码结果:

4️⃣ 使用free释放一块动态开辟内存的一部分

📚 代码演示:

#include <stdio.h>
#include <stdlib.h>
int  main()
{
  int* p = (int*)malloc(100);
  p++;
  free(p);//p不再指向动态内存的起始位置
  return 0;
}

⌨️ 错误原因

这种情况是释放了对于属于我们开辟的内存空间,没有释放完全

  • 当我们把p指针偏移之后,就不在指向原来的起始位置
  • 所以当我们对p指向的空间进行释放的时候就会进行 内存泄漏
  • 这是非常严重的编程错误,直接会导致程序崩溃

📑 代码结果:

5️⃣ 对同一块动态内存多次释放

📚 代码演示:

#include <stdio.h>
#include <stdlib.h>
int  main()
{
  int* p = (int*)malloc(100);
  free(p);
  free(p);//重复释放
  return 0;
}

⌨️ 错误原因

  ⛳️ 这也是写代码糊涂了才会这样,对一块内存进行多块释放!本来p的地址我们都已经释放完了你还让我释放一遍这怎么能这样呢?

📑 代码结果:

💻 解决方法:

这个解决方法也非常简单,我们只要每次 free 释放完把 p 置为空指针就可以了。

  • p 里面都是空指针,都没有存地址
  • 那么我们不管怎么释放都没问题了

6️⃣ 动态开辟内存忘记释放(内存泄漏)

📚 代码演示:

#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 突然去世了,这时不就没人记得 小王的卧底身份了!

  • 这里我们test进行了申请空间但是没有进行释放
  • 而出了这个函数 p 也就进行销毁了没人记得这
  • 个开辟空间的地址

💻 内存泄漏危害:

  ⛳️那么内存泄漏有什么危害呢?这个其实很常见 内存病毒 不知道大家听说过没有?每次开机都没问题,但总是用不到多长时间就会死机!

  • 这个是不是就和内存泄漏很像,如果我们
  • 写了一个程序每次都申请空间都不释放
  • 那么时间长了这个程序就会直接崩溃! ⁉️

所以一定要避免这种情况,免得以后费力吧唧的写了一个代码人家说什么鬼程序用一下就崩!

🔥 注:动态开辟的空间一定要释放,并且正确释放 。

总结

✅ 归纳:

好了以上就是关于动态内存分配的全部注意事项就全部讲解完毕啦!

  对NULL指针的解引用操作

  对动态开辟空间的越界访问

  对非动态开辟内存使用free释放

  使用free释放一块动态开辟内存的一部分

  对同一块动态内存多次释放

☁️ 好了这些就是常见动态内存分配的错误了,大家一定要避免啊!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。



目录
相关文章
|
26天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
330 0
|
11天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
24 3
|
27天前
|
编译器 程序员 C语言
深入C语言:动态内存管理魔法
深入C语言:动态内存管理魔法
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
13天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
14 0
|
22天前
|
C语言
保姆级教学 - C语言 之 动态内存管理
保姆级教学 - C语言 之 动态内存管理
16 0
|
27天前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
27天前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
39 0