【问题标题】:malloc() ,realloc and arraysmalloc() ,realloc 和数组
【发布时间】:2018-08-29 19:59:58
【问题描述】:

我有一个结构,例如

typedef struct bignum {
    long number_of_digits;
    char *digit;
} bignum;

我想声明一个 bignum 类型的数组,数组大小会动态改变,所以我使用了malloc()realloc() 我可以使用realloc() 缩小数组而不会出现内存泄漏。 收缩代码示例

if(free_slots == 50)
{
    big_num_Arr =(bignum *) realloc  (big_num_Arr,(capacity-40)*sizeof(bignum));
    free_slots = 10;
    capacity -= 40;
}

【问题讨论】:

  • 如果结构有动态分配的数据,它们必须被释放。 realloc 无法为您做到这一点
  • 什么是free_slots,什么是capacity
  • "数组大小将动态改变"你是指bignum数组的大小,还是每个digit数组的大小?或两者?在复杂化之前,您应该让您的 bignum 函数与固定长度的数组完美配合。
  • big_num_Arr 这个数组要改了,free_slots和容量都不重要,,,都是if后面的第一行,

标签: c arrays malloc realloc


【解决方案1】:

我可以使用 realloc() 缩小数组而不会出现内存泄漏 (?)

是的,但对于 OP 的代码来说并不可靠。任何重新分配,即使是缩小的,都可能返回NULL,应该检查一下。

if (free_slots == 50) {
  size_t new_capacity = capacity-40;
  ...
  if (new_capacity > 0) {
    void *new_ptr =  realloc(big_num_Arr, sizeof *big_num_Arr * new_capacity);
    if (new_ptr) {
      big_num_Arr = new_ptr; 
      capacity = new_capacity;
    } else if (new_capacity <= capacity) {
      // perhaps leave values "as is" 
      // big_num_Arr = big_num_Arr; 
      // capacity = capacity;
    } else {
      // allocation failure
      // perhaps leave values "as is", yet return a error
      // big_num_Arr = big_num_Arr; 
      // capacity = capacity;
      return failure;
    }
  } else {
    free(big_num_Arr);
    big_num_Arr = NULL; 
    capacity = 0;
  }

【讨论】:

    【解决方案2】:

    假设digit 指针指向动态分配的数组,您需要在realloc() 释放big_num_Arr 的这些元素之前释放它们。

    if(free_slots == 50)
    {
        for (int i = 10; i < free_slots; i++) {
            free(big_num_Arr[i].digit);
        }
        big_num_Arr = realloc(big_num_Arr,(capacity-40)*sizeof(bignum));
        free_slots = 10;
        capacity -= 40;
    }
    

    另外,请参阅Do I cast the result of malloc?

    【讨论】:

    • “假设数字指针指向动态分配的数组”,它是动态分配的,它实际上是一个字符串,所以为了确保我理解你的答案,我从数组中删除了 40 个元素,所以,我需要在这 40 个元素中释放动态分配的字段吗?
    • 是的。此外,请确保在尚未分配任何数字的元素中初始化指向 NULL 的指针。
    • @BaraaNatour 更准确地说:您只需要为要“删除”的 40 个元素中的 digit 指针释放分配的内存
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2018-11-30
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多