2013-07-14 6 views
0

나는 문자열 배열을 정렬를 qsort를 사용하여 몇 가지 기본적인 코드를 만들려고하지만, GDB에 따라, qsort가에 충돌 :기초를 qsort는

#include <string.h> 
#include <stdlib.h> 

static int pcmp(const void * a, const void * b) 
{ 
    return strcmp(* (char * const *) a, * (char * const *) b); 
} 
int main() 
{ 
    char pn[10][256]; 

    memset(pn, 0, sizeof(char) * 10 * 256); 

    strcpy(pn[0], "hello"); 
    strcpy(pn[1], "TEST"); 
    strcpy(pn[2], "abc"); 
    strcpy(pn[3], "000000"); 

    qsort(pn, 4, sizeof (char *), pcmp); 
} 

답변

1
static int pcmp(const void * a, const void * b) 
{ 
    return strcmp((const char *) a, (const char *) b); 
} 
int main() 
{ 
    char pn[10][256]; 

    strcpy(pn[0], "hello"); 
    strcpy(pn[1], "TEST"); 
    strcpy(pn[2], "abc"); 
    strcpy(pn[3], "000000"); 

    qsort(pn, 4, sizeof (char [256]), pcmp); 
    return 0; 
} 
+0

에 대한 호출을 변경할 수 있습니다, 정적 pcmp 만들기의 목적은 무엇인가? –

+0

@DominikC 그에게 물어보십시오. 나는 strcmp를 던지기에 충분하다고 느낍니다. – BLUEPIXY

+0

정적 인 이유는 "man qsort"를 할 때 얻는 예제에서 어떻게 이루어 졌는지입니다. 나는 그것을 복사/붙여 넣기했다. – user2316370

1
qsort(pn, 4, sizeof (char *), pcmp); 
당신은 무엇을 정렬 할 것은 4 char*의 배열입니다 qsort에게

하지만

char pn[10][256]; 

실제로, pn입니다 10 char[256]의 배열입니다. 이러한 것들은 레이아웃과 호환되지 않으며 qsortchar[256] 중 첫 번째 바이트를 char*으로 해석합니다. 이는 정의되지 않은 동작이며 세그먼트 오류를 ​​일으키지 않을 것입니다. 이 특별한 경우에 그것을 해결하기 위해

, 당신은 당신의

static int pcmp(const void * a, const void * b) 
{ 
    return strcmp((const char *) a, (const char *) b); 
} 

에 비교 그런데

qsort(pn, 4, sizeof pn[0], pcmp); 
+0

감사합니다. 내부적으로 "레이아웃 아이디어"가 있다는 것을 몰랐습니다. 문자열을 파싱하고, 0 바이트를 건너 뛰고, 다음 문자열을 구문 분석하고, 실제로 256을 신경 쓰지 않을 것이라고 생각했습니다. – user2316370

관련 문제