C:没有realloc()调整数组大小

时间:2015-10-04 22:43:38

标签: c arrays malloc

我需要重新调整malloc'd 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;
}

2 个答案:

答案 0 :(得分:2)

此代码的一个问题是参数是按值调用的,因此您只更改array的本地副本和泄漏内存。程序其余部分的值永远不会更新。你想要做的是return重新分配的数组。

答案 1 :(得分:2)

就像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和朋友的返回值。他们可能会返回NULL并且根据您的代码,如果您不希望代码崩溃,则可能必须对此做出反应。

另一件事:如果你只使用C,请不要投射malloc我建议使用sizeof *var而不是sizeof(float),因为你正在硬编码类型。假设您必须更改数组的类型。如果你硬化你的类型,你必须在任何地方改变类型,否则只在声明中,更少的工作和更少的错误。

有时您需要或多或少的相同代码用于不同类型。幸运的是,在C ++中你有templates,在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);
    ....
}

我知道很多人会说不使用macros,他们是邪恶的而且他们是真的,但明智地使用它们可能会帮助你更多,谢谢你的想法。你应该尝试尽可能少地核心数据类型的原因之一。

//使用size_t

编辑我的宏代码段,chux的建议