Ответ 1
Нет, и strdup
тоже не соответствует стандарту. Вы можете, конечно, просто написать свой собственный:
int * intdup(int const * src, size_t len)
{
int * p = malloc(len * sizeof(int));
memcpy(p, src, len * sizeof(int));
return p;
}
Каков наилучший способ дублирования целочисленного массива? Я знаю, что memcpy()
- это один из способов сделать это. Есть ли какая-либо функция типа strdup()
?
Нет, и strdup
тоже не соответствует стандарту. Вы можете, конечно, просто написать свой собственный:
int * intdup(int const * src, size_t len)
{
int * p = malloc(len * sizeof(int));
memcpy(p, src, len * sizeof(int));
return p;
}
Это может работать при правильном использовании:
#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 или нет, и для любого типа.