Это может работать, если используется правильно:
#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 или нет, и для любого типа.