2013-01-06 4 views
2

는 C 기준에 따르면 표준 라이브러리에서 제공를 qsort 함수의 형식은왜 qsort의 비교기가 이와 같은 방식이어야합니까?

void 
qsort (void * base, size_t num, size_t size, int (* compar) (const void *, const void *)); 

비교 예 기능은 형태 const void *에 인수를 가지고 있어야하고 const void *

에 의해 무엇을 의미 하는가 왜 내 질문은

또 다른 질문은 함수가 const void * 형식의 인수를 취하는 경우이 포인터가 가리키는 값을 변경할 수 있습니까?

예 :

static int double_a_number(const void * val){ 
    *(int *)val = *(int *)val * 2; 
    return 0; 
} 

이 정말 변수에 발을 두 배로 할 것인가?

도움 주셔서 감사합니다.

+0

두 번째 질문에 대해서는 입력하고 알아낼 수 없습니까? – Pointy

+0

두 번째 질문은 : yes, 'int'객체의 주소와 함께 제공됨. – pmg

+0

@Pointy 정의되지 않은 동작 때문에 대부분의 경우 작동 할 수 있습니다. 어떤 경우에는 단지 "이 경우"가 아니라 항상 작동 하는지를 아는 것이 더 좋습니다. – RedX

답변

3

은 왜 비교 예 함수는이 C.에서 사용할 수있는 가장 일반적인 유형 qsort어떤 유형의 배열을 정렬하는 데 사용될 수 있다는 것을 기억이기 때문에 형태로 const void *

을 인수를 가지고 있습니다.

또 다른 질문은 함수가 const void * 형태의 인수를 취하는 경우이 포인터가 가리키는 값을 변경할 수 있습니까?

캐스팅하지 않고도 const. 그리고 이것은 일반적으로 나쁜 생각입니다 (분명히 예상치 못한 일이며, 정의되지 않은 행동이나 충돌을 유발할 수도 있습니다). 그리고 그것은 비교 함수에서 확실히 의미가 없습니다!

+1

비교 대상이 비교 대상을 변경해서는 안된다는 사실을 상기시키는 것은 바람직하지 않습니까? – us2012

+0

하지만 실제로 나는 두 번째 것을 시도했고 이상한 점은 val에 의해 지시 된 값이 정말로 바뀌 었다는 것입니다. 왜 이런 일이 일어 났습니까? – dorafmon

+0

@dorafmon :'const'를 버리고 기본 객체를 수정하는 것은 기본 객체가 실제로'const'가 아닌 경우 유효합니다. 그러나 예기치 않은 문제입니다 (예 : 사용자의 놀라운 기능). –