【C语言】动态内存的常见错误

打印 上一主题 下一主题

主题 1501|帖子 1501|积分 4503

前言:

在上章节中解说了动态内存的概念和管理的焦点函数。
在本章节继承为大家介绍动态内存的常见错误,让大家更好的明白运用。
补充:利用内存函数必要头文件<stdlib.h>
对NULL指针的解引用操纵


  • 当利用malloc、calloc或realloc等函数分配内存时,假如返回值为NULL(表示分配失败),直接对NULL指针进行解引用会导致程序瓦解。例如:
  1.    int *p = (int*)malloc(10 * sizeof(int));
  2.    if (p == NULL)
  3. {
  4.        // 处理分配失败的情况
  5. }
复制代码
 
正确的做法是先检查返回值是否为NULL,避免直接利用指针。 
 越界访问

在访问动态分配的内存时,假如超出分配的范围,大概会导致程序瓦解或未界说活动。
例如: 
  1.    int *arr = (int*)malloc(5 * sizeof(int));
  2.    for (int i = 0; i <= 5; i++)
  3. {
  4.        arr[i] = i; // 越界访问
  5. }
  6.    free(arr);
复制代码
解决方法是确保访问的索引在有效范围内。
 

开释非动态分配的内存

利用free函数开释非动态分配的内存(如栈上分配的内存)会导致未界说活动。例如:
  1.    int arr[10];
  2.    free(arr); // 错误:释放栈上分配的内存
复制代码
应确保只对动态分配的内存调用free。

重复开释内存(双重开释)


假如对同一块内存多次调用free函数,会导致程序瓦解或未界说活动。例如:
  1.    int *ptr = (int*)malloc(10 * sizeof(int));
  2.    free(ptr);
  3.    free(ptr); // 错误:双重释放
复制代码
 开释部门内存

假如尝试开释动态分配内存的一部门,会导致未界说活动。例如:
  1.    int *ptr = (int*)malloc(10 * sizeof(int));
  2.    free(ptr + 2); // 错误:释放部分内存
复制代码
正确的做法是开释整个内存块。
  1. int main()
  2. {
  3.         int* p = (int*)malloc(40);
  4.         if (p == NULL)
  5.         {
  6.                 perror("malloc");
  7.                 return 0;
  8.         }
  9.         int i = 0;
  10.         for (i = 0;i < 10;i++)
  11.         {
  12.                 *p = 5;
  13.                 p++;
  14.         }
  15.         free(p);
  16.         p = NULL;
  17.         return 0;
  18. }
复制代码
 

 未初始化的指针利用


利用未初始化的指针大概导致程序瓦解或访问非法内存。例如:
  1.    int *ptr;
  2.    printf("%d\n", *ptr); // 错误:未初始化的指针
复制代码
指针在利用前应确保已正确初始化。
内存泄漏

假如分配的内存未被开释,会导致内存泄漏。
例如:
  1.    int *ptr = (int*)malloc(10 * sizeof(int));
  2.    // 程序结束时未释放内存
复制代码
  1. void test()
  2. {
  3.         int* p = (int*)malloc(100);
  4.         if (*p = NULL)
  5.         {
  6.                 *p = 20;
  7.         }
  8. }
  9. int main()
  10. {
  11.         test();
  12.         while (1)
  13.                 ;
  14.         return 0;
  15. }
复制代码
 
 

 
野指针的利用


已开释的指针或指向不存在内存的指针被称为野指针,利用野指针大概导致程序瓦解。例如:
  1.    int *ptr = (int*)malloc(10 * sizeof(int));
  2.    free(ptr);
  3.    printf("%d\n", *ptr); // 错误:野指针
复制代码
 缓冲区溢出


在访问动态分配的数组时,假如超出数组边界,大概导致缓冲区溢出。例如:
  1.    int *arr = (int*)malloc(5 * sizeof(int));
  2.    for (int i = 0; i < 6; i++) {
  3.        arr[i] = i; // 缓冲区溢出
  4.    }
  5.    free(arr);
复制代码
 未检查realloc失败


利用realloc调解内存大小时,假如失败会返回NULL,但原内存块大概仍旧有效。例如:
  1.     int *ptr = (int*)malloc(10 * sizeof(int));
  2.     ptr = (int*)realloc(ptr, 20 * sizeof(int));
  3.     if (ptr == NULL) {
  4.         // 处理失败情况
  5.     }
  6.     free(ptr);
复制代码
总结:
C语言中的动态内存管理涉及复杂的操纵,容易引发多种错误。开发者应严格依照以下原则:


  • 在利用前检查指针是否为NULL。
  • 确保访问内存时在有效范围内。
  • 避免重复开释内存。
  • 及时开释不再利用的动态内存。
  • 利用工具(如Valgrind)检测潜在题目。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表