2015-02-07 3 views
1

stackoverflow의 answer에 일반 스왑 함수에 대한 다음 선언이 있습니다. 우리는 C에서 유사한 기능을 작성하는 경우매크로의 크기와 함수의 차이점

#define swap(x,y) do \ 
{ unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \ 
    memcpy(swap_temp,&y,sizeof(x)); \ 
    memcpy(&y,&x,  sizeof(x)); \ 
    memcpy(&x,swap_temp,sizeof(x)); \ 
} while(0) 

그러나 그것은 작동하지 않으며, 작동하려면 우리는 명시 적으로 * 빈 공간의 크기에 유형을 통과해야합니다. 매크로가 호출되는 함수 내에서 매크로가 확장되고 sizeof가 변수 x 또는 y와 동일한 범위에 있기 때문에 sizeof가 작동하기 때문에 이러한 현상이 발생한다는 것을 이해합니다. 나 맞아?

만약 그렇다면. 다음 상황을 고려하십시오.

void someComplexFunction(void* a, void* b){ 
swap(a,b); 
} 

이게 맞습니까? 나는 그것을 시도하고 그것은 효과가있다. 왜 이것이 효과가 있습니까?

답변

1

실제 주소가 아닌 포인터의 주소를 바꾸면됩니다.

이 코드는

char *foo = "foo"; 
char *bar = "bar"; 

printf("before swap\n"); 
printf("foo address '%08x', foo content '%s'\n", foo, foo); 
printf("foo address '%08x', foo content '%s'\n", bar, bar); 

swap(foo, bar); 

printf("after swap\n"); 
printf("foo address '%08x', foo content '%s'\n", foo, foo); 
printf("foo address '%08x', foo content '%s'\n", bar, bar); 

출력이

before swap 
foo address '010e58a8', foo content 'foo' 
foo address '010e58ac', foo content 'bar' 
after swap 
foo address '010e58ac', foo content 'bar' 
foo address '010e58a8', foo content 'foo' 
+0

유사하지만,이 값에 의해 단지 통과 도시이다. – Sohaib

+0

값이 아닌 포인터를 전달하고 있습니다. C/C++에서는 항상 포인터를 조작 할 수 있습니다. – esskar

+0

오케이. 알았다! – Sohaib

관련 문제