2012-11-28 2 views
0

내가 스왑 기능과 같이이 이제사용하여 무효 포인터가

main() 
{ 
    int arr[8] = {4,7,9,2,6,7,8,1}; 
    void *ptr = arr; 
    swap(0, 1, ptr); 
    int k; 
    for (k=0; k<8; k++) 
     printf("%d ", arr[k]); 
} 

, 스왑은 잘 작동하는 것 같다, 그러나 대신 1 값을 다른 값으로 스와핑하는 경우 다른 2 값과 2 값을 스와핑합니다. 내가 스왑 (0, 1, PTR)을 할 때 점점되어야 할 때 예를 들어, 내가 배열

9,2,4,7,6,7,8,1 

를 얻을 :

7,4,9,2,6,7,8,1 

를 대신 4, 7 스와핑, 그것은 4 교환입니다 , 9시 9 분. 왜이 일을하는거야?

+0

보이는이를 sizeof 편곡의 printf와 시도 [0] sizeof int를 확인하기 위해 크기에 대한 추가 매개 변수를 전달하고 memcpy와 함께 char [size] 버퍼를 사용하거나 다른 주소임을 확인하면 xor 스왑을 사용할 수 있습니다 (즉, 1과 1을 교환하지 마십시오) – technosaurus

답변

5

swap()은 배열을 포인터의 배열로 취급하지만 실제로 전달되는 배열은 int의 배열입니다. 분명히, 여러분의 시스템은 포인터가 두 개의 크기 인 int과 같아서 "포인터"를 바꿀 때마다 정말 두 개의 정수를 교환합니다.

당신은 이런 식으로 뭔가로 스왑 루틴을 필요 : 당신은 기본적으로 당신에게 64 비트를 제공하는 64 비트 시스템처럼

void swap(int i, int j, int arr[]) 
{ 
    int temp; 
    temp = arr[i]; 
    arr[i] = arr[j]; 
    arr[j] = temp; 
} 
+0

'i' /'j'가> size/2 인 경우에 segfault가 발생할 수 있습니다. –

+0

아, 예, 타입이'void * '가 아닌'void * arr []'... –

+0

이것은 가장 좋은 것 같습니다 할, 고마워. – me45