[C] memcpy()를 사용한 swap

2019. 7. 26. 19:09 기타/C언어

[C] memcpy()를 사용한 swap


swap 함수를 작성할 때는, 포인터로 인자를 넘겨야 한다.


값을 인자로 넘길 경우 원본을 복사한 사본이 넘어오므로, 원본에는 값이 변경되지 않기 때문이다.


보통 swap 함수는 아래와 같이 작성된다.


void swap(int *a, int *b){
    int t;
    t = *a;
    *a = *b;
    *b = t;
}


위와 같은 방법으로 int 형의 데이터 a 와 b의 데이터를 swap 할 수 있다.


하지만 int 형 외에 다른 타입의 swap을 하기 위해 타입별로 swap 함수를 만드는 것은 비효율적이다.

이러한 경우에 인자를 void* 형으로 받고, 넘어오는 인자의 size 를 같이 넘겨준 후 memcpy()를 사용하여 swap을 하면 여러형의 변수에 사용할 수 있다.


#include <malloc.h>

void swap2(void *a, void *b, int n){
    
    void *t;
    t = malloc(n);
    memcpy(t, a, n);
    memcpy(a, b, n);
    memcpy(b, t, n);
    free(t);
}


* memcpy(void* a, void* b, int n) : 포인터 b가 가리키는 데이터에서 n 크기만큼을 포인터 a가 가리키는 값에 복사한다.



Main 함수


#include <stdio.h>
    
void main(void){

    int x = 10, y = 20;
    
    printf("Initial val - x : %d, y : %d \n", x, y);
    swap(&x, &y);
    printf("After swap val - x : %d, y : %d \n", x, y);

    swap2(&x, &y, sizeof(int));
    printf("After swap2 val - x : %d, y : %d \n", x, y);

    return 0;
}



출처: https://hyeonstorage.tistory.com/339?category=622873 [개발이 하고 싶어요]