2013-08-23 4 views
0
qsort(words, size1, size2, compareWords); 

내부 비교 단어 :C를 qsort의 문자열 배열

int compareWords(const void *ac, const void *bc) 

이 작품 :

char const *a = *(const char **)ac; 

이 그렇지 (a 일부 쓰레기 값을 얻는다) :

char const *a = ac; 
    char const *a = (const char *) ac; 

그 근거는 무엇인가?

또한, 일부 실시 예에서, size2sizeof(char *)으로 나타납니다. 이것은 sizeof(*words)이 아니어야합니까? T의 배열을 보내고 char *words[] = {"abc", "pqr", "abcd", "pqsl"};

+0

'단어'선언을 보여줘야합니다. 단어에 액세스하는 방법에 대한 질문을하고 있기 때문입니다. – unwind

+0

맞습니다. 'size2'는 하나의 요소 크기입니다. 그래서,'size2 = sizeof (* words)'또는 더 나은'size2 = sizeof (char)'. – Michael

+0

@Michael은 sizeof (* words) = sizeof (char)입니까? 내 예제의 단어 배열에서 sizeof (* words)는 sizeof (char) = 1 인 반면에 4가 나온다. 나는 동일하다고 생각하지 않는다. – Sushil

답변

3

qsort T 값으로 촬영 할 수 없기 때문에, 당신의 비교 함수가 const T*에 그 const void* 포인터를 변환해야합니다 :로

단어가 선언된다. wordschar* 또는 char const *의 배열 인 경우

,이 방법을 말했을 때 그것은 자연스러운 각각 char* const * 또는 char const * const *에 인수를 변환해야합니다.

+0

'* (const char **) ac'로 무엇을 알기를 원했던가? - 나에게 꽤 직관적이지 않은 것처럼 보였다. const (const char *)를 사용하여 형변환에있어 잘못된 점은 무엇인가? – Sushil

+1

당신은'char *'의 배열을 가지고 있고, 비교 함수는 항상 배열의 원소에 대한 포인터를받습니다 *. 따라서'char *'에 대한 포인터. 이 포인터는 또한 const 일 수 있으므로'* (const char **) ac'는 const-correct는 아니지만이 포인터에 쓰려고하지 않으므로 실제 결과는 없습니다. – Medinoc