Я хотел бы изменить размер одномерного массива целых чисел, сохранить значения из исходного массива и инициализировать новые значения с нулями. До сих пор я придумал две альтернативы (а) с использованием calloc
и memcpy
:
// Resizes composition
int compo_resize(int len, int *a) {
// initialise new composition
int *c = calloc(2*len, sizeof a[0]);
if (c == NULL) {
fprintf(stderr, "calloc() failed");
return LieanderErrorOutOfMemory;
}
// copy numbers from old to new composition
memcpy(c, a, sizeof a[0] * len);
// modify composition in-place
*a = *c;
// release memory
free(c);
return LieanderSuccess;
}
и (b) с использованием realloc
и memset
:
// Resizes composition
int compo_resize(int len, int *a) {
printf("Note: resizing composition...\n");
// reallocate memory
void *c = realloc(a, 2*len);
if (c == NULL) {
fprintf(stderr, "realloc() failed");
return LieanderErrorOutOfMemory;
}
else {
// reassign pointer
a = c;
// zero out new elements
memset(&a[len], 0, len * sizeof a[len]);
}
return LieanderSuccess;
}
Я бы сказал, что второй подход более элегантный и быстрый. Однако при интеграции в большую программу код начинает возвращать неожиданные, неправильные значения. Я делаю что-то не так в подходе (б)? Я что-то упускаю из виду?
Вызов combo_resize()
является int retval = compo_resize(f->len, f->a)
, где f
- это пользовательская структура, называемая pair
:
typedef struct {
int fac; // multiplication factor
int idx; // index of Lieander
int len; // length of compositions
int kth; // no. of elements in compositions
int *a; // composition 1
int *b; // composition 2
int num; // natural no.
} pair;