我需要重新设置malloc数组的大小。然而,我不应该使用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
及其友元的返回值。它们可能会返回NULL
,根据你的代码,如果你不想让你的代码崩溃,你可能不得不对此做出反应。
另一件事:如果你只使用C,不要强制转换malloc
,我建议使用sizeof *var
而不是sizeof(float)
,因为你是硬编码类型。假设你要改变数组的类型。如果你硬核你的类型,你必须改变类型无处不在,否则只在声明中,更少的工作和更少的错误。
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
,他们是邪恶的,他们是真的,但明智地使用它们可能会帮助你更多的感谢你的想法。您应该尽量减少硬核数据类型的原因之一。
//编辑我的宏片段,chux的建议使用size_t
这段代码的一个问题是参数是按值调用的,因此您只更改了array
的本地副本并泄漏了内存。程序其余部分中的值永远不会更新。您要做的是return
重新分配的数组