C:在没有 realloc() 的情况下调整数组大小
C: resize an array WITHOUT realloc()
我需要重新调整 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;
}
此代码的一个问题是参数是按值调用的,因此您仅更改 array
的本地副本并泄漏内存。程序其余部分的值永远不会更新。你想要做的是 return
重新分配的数组。
就像 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
和朋友的 return 值。它们可能 return 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
,它们是邪恶的而且它们有点真实,但明智地使用它们可能会有所帮助你更感谢你的想法。您应该尝试尽可能少地硬核数据类型的原因之一。
// 编辑我的宏片段,chux 的建议 size_t
我需要重新调整 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;
}
此代码的一个问题是参数是按值调用的,因此您仅更改 array
的本地副本并泄漏内存。程序其余部分的值永远不会更新。你想要做的是 return
重新分配的数组。
就像 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
和朋友的 return 值。它们可能 return 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
,它们是邪恶的而且它们有点真实,但明智地使用它们可能会有所帮助你更感谢你的想法。您应该尝试尽可能少地硬核数据类型的原因之一。
// 编辑我的宏片段,chux 的建议 size_t