Как скопировать один целочисленный массив в другой - PullRequest
17 голосов
/ 27 ноября 2011

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

Ответы [ 2 ]

27 голосов
/ 27 ноября 2011

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

int * intdup(int const * src, size_t len)
{
   int * p = malloc(len * sizeof(int));
   memcpy(p, src, len * sizeof(int));
   return p;
}
1 голос
/ 27 ноября 2011

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

#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, должен соответствовать типу исходного массива (не void *, если не приведен к правильному типу)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...