Поскольку C является процедурным языком, полезно определить функции для таких операций.Стандарт C предусматривает специальный тип size_t
для размеров.
int *concatIntArrays(int *dest, size_t maxSize, const int *arr1, const size_t arr1Size, const int *arr2, const size_t arr2Size)
{
size_t toCopy;
if(!dest)
{
dest = malloc(maxSize ? maxSize * sizeof(*dest) : (maxSize = (arr1Size + arr2Size)) * sizeof(*dest));
}
if(dest)
{
if(arr1Size <= maxSize) toCopy = arr1Size;
else toCopy = maxSize;
memcpy(dest, arr1, toCopy * sizeof(*dest));
maxSize -= toCopy;
if(arr2Size <= maxSize) toCopy = arr2Size;
else toCopy = maxSize;
memcpy(dest + arr1Size, arr2, toCopy * sizeof(*dest));
}
return dest;
}
или более общий:
void *concatArrays(void *dest, const size_t elemSize, size_t maxSize, const void *arr1, const size_t arr1Size, const void *arr2, const size_t arr2Size)
{
size_t toCopy;
char *tempdest = dest;
if(!dest)
{
dest = malloc(maxSize ? maxSize * elemSize : (maxSize = (arr1Size + arr2Size)) * elemSize);
}
if(dest)
{
if(arr1Size <= maxSize) toCopy = arr1Size;
else toCopy = maxSize;
memcpy(dest, arr1, toCopy * elemSize);
maxSize -= toCopy;
if(arr2Size <= maxSize) toCopy = arr2Size;
else toCopy = maxSize;
memcpy(tempdest + arr1Size * elemSize, arr2, toCopy * elemsize);
}
return dest;
}
, где все размеры указаны в элементах.elemSize в байтах.
Вы можете передать свой собственный буфер (целевой массив) или NULL - тогда функция выделит его для вас.Если maxSize равен нулю, он выделяет столько памяти, сколько необходимо для размещения обоих массивов.