ду не будет работать как есть.Это должно быть:
void doo(int **b)
{
*b = (int *) realloc(*b, 5*sizeof(int));
return;
}
и вызываться по
doo(&a);
Ваша оригинальная версия может иногда случайно работать, если realloc происходит сразу после malloc, поэтому есть место для расширенияблок памяти на месте.Но на это не следует рассчитывать.
Теперь, чтобы ответить на ваш актуальный вопрос, поскольку мы имеем дело с простыми элементами данных (т. Е. Целыми числами), вы можете использовать memmove()
или memcpy()
для их копирования:(memmove безопасен, если блоки памяти перекрываются; memcpy нет, но здесь это не проблема)
one.index1 = (int *) malloc(5*sizeof(int)); // Line 2
memcpy(one.index1, a, sizeof(int) * 5);
Что касается эффективности memmove / memcpy, это в значительной степени неизвестная область.memmove делает немного большую проверку диапазона, чем memcpy, так что это будет намного медленнее memcpy.Насколько memcpy против цикла, сказать сложно.У memcpy немного больше накладных расходов, но он называется много , поэтому у поставщиков компиляторов есть парень, который тратит много времени, чтобы быть уверенным, что это максимально быстро.
Обратите внимание, однако, учитывая небольшое фиксированное количество элементов для копирования, самый быстрый способ - просто скопировать их напрямую:
one.index1 = (int *) malloc(5*sizeof(int)); // Line 2
one.index1[0] = a[0];
one.index1[1] = a[1];
one.index1[2] = a[2];
one.index1[3] = a[3];
one.index1[4] = a[4];