2016-06-20 2 views
-1

내 문제 : 두 항목을 제네릭 형식의 배열로 바꿀 수있는 함수를 만들고 싶습니다.C - 제네릭 함수 : 두 개의 항목을 배열로 바꿔

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 : 여기

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); 
} 

는 모든 유형의 배열에 두 항목을 교환 할 기능의 내 시도 :

나는 어떤 유형의 두 항목을 교환 할 수 SwapG 기능이 나는 포인터를 엉망으로 만들었다 고 확신하지만 여전히 해결책을 찾을 수 없다. 나는 어떤 도움을 주셔서 감사합니다 :).

+2

참고 : 복사가 완료되면'free (temp);를 사용하십시오. – chux

+0

간단한 매크로를 사용할 때의 문제점은 무엇입니까? 귀하의 코드는 프로그래밍 오류에 대한 초대장이며 각 스왑에 대한 메모리 할당/해제가 매우 느립니다. – Olaf

+1

동일한 배열의 두 항목을 바꾸려면 첫 번째 기능을 사용하지 않으시겠습니까? 'SwapG (array [idx1], array [idx2], sizeof (entry))' – EOF

답변

1

void *에 추가하는 것은 정의되지 않습니다. 캐스트는 char *입니다.

아마도 arr을 참조 해제해야 할 필요가있을 수도 있지만 OP의 서명을 대신 조정해야한다고 생각합니다. @user3386109

규모를 포인터 계산 @EOF 할당 된 메모리 너무

무료를 참조하십시오.


나는 충분하기 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); 

참고 : 목표를 코딩 일반적으로 유형 int보다 선호되는 유형 size_t의 인덱스를 사용하는 방법에 따라 달라집니다.

참고 assert(temp);NULL메모리 부족하지 돌아갈 수 0 바이트로 할당 if (size > 0) 내에 있음. OTOH, size == 0이 가장 드뭅니다.

+0

@chox 고마워, 미안,이 질문이 벙어리 였다면, 나는 방금 C –