C:在没有 realloc() 的情况下调整数组大小

标签 c arrays malloc

我需要重新调整 malloc 的 C 数组的大小。但是,我不应该使用 realloc() (它用于分配)。下面的代码不断抛出 double free or corruption (out) 更具体地说,这个函数似乎什么都不做,因为无论我是否调用它,程序的行为都是一样的。我觉得我可能缺少一些基本的东西。谁能帮我吗?非常感谢

void double_array_size(float *array, int *size) {
  float *temp = NULL;
  int i;
  temp = (float *) malloc(*size * 2 * sizeof(float));

  for (i = 0; i < *size; i++) {
    temp[i] = array[i];
  }

  *size *= 2;

  free(array);
  array = temp;
}

最佳答案

就像 BLUEPIXY 说的那样,传递一个双指针,或者如果你不想,最好这样:

float *double_array_size(float *array, int *size) {
  float *temp = NULL;
  int i;
  temp = (float *) malloc(*size * 2 * sizeof(float));

  for (i = 0; i < *size; i++) {
    temp[i] = array[i];
  }   

  *size *= 2;

  free(array);
  return temp;
}   

为了提高代码的性能,不要使用 for 循环,而是使用 memcpy:

temp = (float *) malloc(*size * 2 * sizeof(float));
memcpy(temp, array, sizeof *array * *size);

你应该经常检查 malloc 和 friend 的返回值。它们可能会返回 NULL,并且根据您的代码,如果您不希望代码崩溃,您可能必须对此使用react。

另一件事:如果你只使用 C,不要转换 malloc 我建议使用 sizeof *var 而不是 sizeof(float) 因为您正在对类型进行硬编码。假设您必须更改数组的类型。如果你硬核你的类型,你必须在所有地方更改类型,否则只在声明中更改,工作量和错误都会少得多。

有时您需要为不同的类型编写或多或少相同的代码。幸运的是,在 C++ 中你有 模板,在 C 中你必须使用宏,如果你不想一遍又一遍地重复基本相同的代码,例如:

#define DOUBLE_ARRAY_SIZE(type) \
    type *double_array_size_ ##type (type *array, size_t *size) {\
          type *temp; \
          temp = malloc(*size * 2 * sizeof *array);\
          if(temp == NULL)\
              return NULL;\
          memcpy(temp, array, sizeof *array * *size);\
          *size *= 2;\
          free(array);\
          return temp;\
        }

而不是一遍又一遍地编写不同类型的相同代码,你可以这样做

DOUBLE_ARRAY_SIZE(int)
DOUBLE_ARRAY_SIZE(double)
DOUBLE_ARRAY_SIZE(record_t)

void foo()
{
    int *ints = malloc(...);
    record_t *recs = malloc(...);
    ...
    new_ints = double_array_size_int(ints, ints_size);
    new_recs = double_array_size_record_t(recs, recs_size);
    ....
}

我知道很多人会说不要使用,它们是邪恶的,它们是真的,但明智地使用它们可能对您有更大帮助谢谢你认为。您应该尝试尽可能少地硬核数据类型的原因之一。

//编辑我的宏片段,chux 的建议是 size_t

关于C:在没有 realloc() 的情况下调整数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32939150/

相关文章:

c - C中堆栈帧的函数参数名称和变量名称?

c++ - Windows 系统中是否存在未缓冲的 I/O?

c - 数组输出错误

python - numpy - 如何按索引计算嵌套列表中项目的出现次数?

c - 如何使用 malloc 将 C 中的 int 变量转换为 char *array?

C++ new 分配比预期更多的空间

c - 指针到指针赋值的段错误

c - 如何在 C 中使用 libtomcrypt API 并对其执行基准测试

c++ - 通过指针访问 C 中 4d 数组中的元素

c - 如何生成预处理的 C 代码