Как скопировать один целочисленный массив в другой

Каков наилучший способ дублирования целочисленного массива? Я знаю, что memcpy() - это один из способов сделать это. Есть ли какая-либо функция типа strdup()?

Ответы

Ответ 1

Нет, и strdup тоже не соответствует стандарту. Вы можете, конечно, просто написать свой собственный:

int * intdup(int const * src, size_t len)
{
   int * p = malloc(len * sizeof(int));
   memcpy(p, src, len * sizeof(int));
   return p;
}

Ответ 2

Это может работать при правильном использовании:

#define arrayDup(DST,SRC,LEN) \
            { size_t TMPSZ = sizeof(*(SRC)) * (LEN); \
              if ( ((DST) = malloc(TMPSZ)) != NULL ) \
                memcpy((DST), (SRC), TMPSZ); }

Затем вы можете сделать:

double dsrc[4] = { 1.1, 2.2, 3.3, 4.4 };
int *isrc = malloc(3*sizeof(int));
char *cdest;
int *idest;
double *ddest;
isrc[0] = 2; isrc[1] = 4; isrc[2] = 6;

arrayDup(cdest,"Hello",6); /* duplicate a string literal */
arrayDup(idest,isrc,3);    /* duplicate a malloc'ed array */
arrayDup(ddest,dsrc,4);    /* duplicate a regular array */

Оговорки:

  • параметры макроса SRC и DST оцениваются более одного раза
  • Тип указателя/массива, передаваемый как SRC, должен соответствовать типу исходного массива (no void *, если не указывается правильный тип)

С другой стороны, он работает независимо от того, был ли исходный массив malloc() ed или нет, и для любого типа.