C:在不使用realloc()的情况下调整数组大小

C:在不使用realloc()的情况下调整数组大小,c,arrays,malloc,C,Arrays,Malloc,我需要重新调整malloc'd C数组的大小。但是,我不应该使用realloc()(它是用于作业的)。下面的代码不断抛出双重释放或损坏(out)更具体地说,这个函数似乎什么都不做,因为无论我是否调用它,程序的行为都是一样的。我觉得我可能错过了一些基本的东西。有人能帮我吗?非常感谢 void double_array_size(float *array, int *size) { float *temp = NULL; int i; temp = (float *) malloc(*s

我需要重新调整malloc'd C数组的大小。但是,我不应该使用
realloc()
(它是用于作业的)。下面的代码不断抛出
双重释放或损坏(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;
}
无效双数组大小(浮点*数组,整数*大小){
float*temp=NULL;
int i;
温度=(浮动*)malloc(*size*2*sizeof(浮动));
对于(i=0;i<*大小;i++){
temp[i]=数组[i];
}
*尺寸*=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;
}   
您应该始终检查
malloc
和friends的返回值。它们可能返回
NULL
,根据您的代码,如果不希望代码崩溃,您可能必须对此作出反应

另一件事:如果您只使用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

就像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;
}   
您应该始终检查
malloc
和friends的返回值。它们可能返回
NULL
,根据您的代码,如果不希望代码崩溃,您可能必须对此作出反应

另一件事:如果您只使用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);
    ....
}
我知道很多人会说不要使用
,它们是邪恶的,它们是真实的,但是明智地使用它们可能会帮助你更多,谢谢你的想法。其中一个原因是您应该尽可能少地对数据类型进行硬核处理


//用
size\t

编辑我的宏代码片段,chux的建议,你希望如何
void f(int x){x=5;}int main(){int i=7;f(i);printf(“%d\n”,i);返回0;}
打印?@immibis right,但我认为传递指针的想法是,它可以让你在另一种方法中改变这样的事情。你需要将指针传递给指针,比如
float**array
@B1CL0PS。你需要发布其余的代码,主要问题已经解决了,但我仍然很好奇看到其余的代码,看看你希望它如何工作,不要这样使用
free()
,调用
free()
的上下文对我来说似乎是错误和危险的。@B1CL0PS传递指针允许函数更改指针指向的对象。但是
double\u array\u size()
也在更改指针本身。您希望
void f(int x){x=5;}int main(){int i=7;f(i);printf(“%d\n”,i);return 0;}
打印什么?@immibis right,但我认为传递指针的想法是,它可以让你在另一种方法中改变这样的事情。你需要将指针传递给指针,比如
float**array
@B1CL0PS。你需要发布其余的代码,主要问题已经解决了,但我仍然很好奇看到其余的代码,看看你希望它如何工作,不要这样使用
free()
,调用
free()
的上下文对我来说似乎是错误和危险的。@B1CL0PS传递指针允许函数更改指针指向的对象。但是
double\u array\u size()
也在更改指针本身。Minor:
size\u t*size
而不是
int*size
。不要在C中强制转换
malloc
&friends的结果!小调:
size\u t*size
而不是
int*size
。不要在C中使用
malloc
和friends的结果!