/ C, PROGRAMMING

C언어: qsort 함수

qsort

<stdlib.h> 헤더에 정의됨

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

base : 배열의 첫 번째 요소를 가리키는 포인터

nmemb : 멤버 수

size : 각 멤버 또는 요소의 크기

compar : 비교 함수에 대한 포인터

주의사항

비교 대상(즉, 배열 내 요소)으로의 포인터에 해당하는 argument가 const void* 형이다.

  • 상수 포인터이므로 포인터가 가리키는 대상을 변경 불가능하다.

  • void* 형이므로 그대로 역참조에 사용할 수 없고 비교 대상에 따라 함수 내부에서 적절한 캐스팅이 필요하다.

문자열의 배열(char* 형 배열)을 정렬 시, 비교 함수 작성에 유의

int compare_strings(const void* p, const void* q)
{
    return strcmp(*(char**)p,*(char**)q); //p,q는 문자열을 가리키는 char*형 포인터를 가리키는 포인터의 주소이므로 char**형으로 캐스팅이 필요하다.
}

비교 함수의 argument에 전달되는 것은 문자열이 아니라 각 배열 요소에 해당하는 문자열을 가리키는 포인터이므로, 비교 대상 문자열들을 strcmp에 전달하기 위해서는 char** 형으로의 캐스팅 이후 역참조가 필요하다.