2016-06-20 3 views
-1

Моя проблема: Я хотел бы создать функцию, которая может менять любые два элемента в массиве родового типа.C - общая функция: обмен двумя элементами в массиве

У меня есть функция SwapG, которая может поменять два элемента любого типа:

void SwapG(void * a, void * b, size_t size) 
{ 
    void * temp = malloc(size); 
    memcpy(temp, a, size); 
    memcpy(a, b, size); 
    memcpy(b, temp, size); 
} 

Вот моя попытка функции, которая будет обменять два элемента в массиве любого типа:

void SwapInArrayG(void ** arr, int a, int b, size_t size) 
{ 
    void * temp = malloc(size); 
    memcpy(temp, *(arr + a), size); 
    memcpy(*(arr + a), *(arr + b), size); 
    memcpy(*(arr + b), temp, size); 
} 

I Я уверен, что я перепутал указатели, но я не могу найти решение. Буду признателен за любую помощь :).

+2

Примечание: после завершения копирования полезно «free» (temp); ' – chux

+0

В чем проблема с использованием простого макроса? Ваш код является приглашением к ошибкам программирования и будет очень медленным распределением/освобождением памяти для каждого свопа. – Olaf

+1

Если вы хотите поменять местами две записи в одном массиве, почему бы вам не использовать первую функцию? 'SwapG (& array [idx1], & array [idx2], sizeof (entry))' – EOF

ответ

1

Добавление к void * не определено. Бросить на char *.

Возможно, потребуется снять ссылку с arr, но я думаю, что вместо этого необходимо подставить подпись OP. См @user3386109

шкала расчета указателя @EOF

Free выделенной памяти тоже.


Я ожидаю, что достаточно пройти void *.

void SwapInArrayG(void * arr, int a, int b, size_t size) { 
    void * temp = malloc(size); 
    if (size > 0) { 
     assert(temp); 
     assert(a >= 0 && b >= 0); 
     memcpy(temp, (char *)arr + size*a, size); 
     memcpy((char *)arr + size*a, (char *)arr + size*b, size); 
     memcpy((char *)arr + size*b, temp, size); 
    } 
    free(temp); 
} 

Непонятно, как OP вызывает эту функцию, но типично следующее.

foo_type G[some_size]; 
SwapInArrayG(G, index_a, index_b, sizeof *G); 

Примечание: в зависимости от цели кодирования, используя индексы типа size_t, как правило, предпочтительнее типа int.

Примечание: что assert(temp); находится в пределах if (size > 0) как выделение 0 байт может вернуть NULL и не быть из-за нехватки памяти. OTOH, size == 0 является самым необычным.

+0

@chox Большое спасибо, извините, если этот вопрос был немым, я просто изучаю C –

Смежные вопросы