[其他] 内存相关的realloc函数和free函数

[复制链接]
 楼主| OKAKAKO 发表于 2024-6-18 12:00 | 显示全部楼层 |阅读模式
1、realloc函数
realloc函数,用于调整已经分配的内存区域的大小。它的原型如下:

1void* realloc(void* ptr, size_t size);
realloc函数接受两个参数:ptr是指向已经分配的内存区域的指针,size表示新的内存区域大小。realloc函数会尝试将原有的内存区域大小调整为新的大小,并返回指向新内存区域的指针。如果调整成功,原有的数据将被保留;如果调整失败(例如,系统没有足够的连续内存空间),则原有的内存区域保持不变,并返回NULL。

需要注意的是,如果新的size参数小于原有内存区域的大小,realloc函数可能会减少内存区域的大小,并丢弃超出新大小的数据。因此,在使用realloc函数时,需要确保正确处理可能的数据丢失情况。

realloc函数的示例代码:

  1. 1#include <stdio.h>  
  2. 2#include <stdlib.h>  
  3. 3
  4. 4int main(int argc, char *argv[]) {  
  5. 5    int* p;  
  6. 6    int n = 5;  
  7. 7
  8. 8    // 使用malloc分配内存  
  9. 9    p = (int*)malloc(n * sizeof(int));  
  10. 10    if (p == NULL) {  
  11. 11        printf("内存分配失败!\n");  
  12. 12        return 1;  
  13. 13    }  
  14. 14
  15. 15    // 使用分配的内存  
  16. 16    for (int i = 0; i < n; i++) {  
  17. 17        p[i] = i + 1;  
  18. 18    }  
  19. 19
  20. 20    // 打印数组元素  
  21. 21    for (int i = 0; i < n; i++) {  
  22. 22        printf("%d ", p[i]);  
  23. 23    }  
  24. 24    printf("\n");  
  25. 25
  26. 26    // 调整内存大小 ,假设需要更大的内存空间
  27. 27    n = 10;
  28. 28    p = (int*)realloc(p, n * sizeof(int));  
  29. 29    if (p == NULL) {  
  30. 30        printf("内存调整失败!\n");  
  31. 31        return 1;
  32. 32    }  
  33. 33
  34. 34    // 使用新的内存空间  
  35. 35    for (int i = n / 2; i < n; i++) {  
  36. 36        p[i] = i + 1;  
  37. 37    }  
  38. 38
  39. 39    // 打印调整后的数组元素  
  40. 40    for (int i = 0; i < n; i++) {  
  41. 41        printf("%d ", p[i]);  
  42. 42    }  
  43. 43    printf("\n");  
  44. 44
  45. 45    // 释放内存  
  46. 46    free(p);  
  47. 47
  48. 48    return 0;  
  49. 49}

在上面的示例中,首先,使用malloc函数分配了一个大小为5个int类型的内存区域。然后,使用realloc函数将该内存区域的大小调整为10个int类型的大小,并继续使用这块内存存储数据。最后,使用free函数释放了这块内存。

2、free函数
无论是使用malloc、calloc还是realloc函数分配的内存,都需要在使用完毕后进行释放,以避免内存泄漏。free函数的原型如下:

1void free(void* ptr);
free函数接受一个指向要释放的内存区域的指针作为参数.这样可以防止内存泄漏,即程序持续占用不再需要的内存,最终导致可用内存耗尽。在调用 free 函数后,之前指向该内存区域的指针不再有效。为了避免野指针(dangling pointer)的问题,通常建议将指针设置为 NULL,这样如果后续代码中不小心再次使用了这个指针,程序会因为尝试访问空指针而立即崩溃,而不是继续执行并可能导致未定义行为。

  1. 1free(p);  
  2. 2p = NULL;


评论

技术贴  发表于 2024-6-25 10:07
LOVEEVER 发表于 2024-7-15 14:50 | 显示全部楼层
realloc函数,用于调整已经分配的内存区域的大小
szt1993 发表于 2024-7-17 19:07 | 显示全部楼层
realloc函数可能会减少内存区域的大小,并丢弃超出新大小的数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

257

主题

2006

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部