2015-03-05 5 views
2

Надеюсь, я коротко и ясно понял, что я пытаюсь сделать ниже.Застрял! .. сочетание ошибки сегментации, qsort_r, массивы, указатели

Код довольно сложный для вопроса SOF, и я не думал, что смогу сделать его более простым, сохраняя его непосредственно под контролем других.

поэтому я вырезал соответствующие детали и поместил их здесь.

Почему я получаю эту ошибку и могу ли вы помочь мне исправить ее?

любая помощь приветствуется!

спасибо.

char words[100][WORD_LENGTH]; 

    char temp[WORD_LENGTH]; 

    // scan the next %s from stream and put it to temp 
    while(fscanf(file, "%s", temp) > 0){ 
     // printf("reducer reads: %s\n", temp); 

     strcpy(words[arr_i], temp); 
     printf("%d -- %s\n", arr_i, words[arr_i]); 

     arr_i++; 

    } 

Во второй строке я получаю ошибку ошибки сегментации. (И, возможно, утечка с Valgrind)

int thunk = WORD_LENGTH; 
    qsort_r(&words, sizeof(words)/sizeof(words[0]), sizeof(words[0]), cmpstringp, &thunk); 

от "человека QSort":

static int cmpstringp(const void *p1, const void *p2) { 
    /* The actual arguments to this function are "pointers to 
     pointers to char", but strcmp(3) arguments are "pointers 
     to char", hence the following cast plus dereference */ 

    return strcmp(* (char * const *) p1, * (char * const *) p2); 
} 
+0

Каково определение 'WORD_LENGTH'? –

+0

@StefanoSanfilippo #define WORD_LENGTH 255 – mmswe

+0

Вы проверили свой массив слов для допустимых строк (длина, нуль-окончание)? –

ответ

5

В соответствии с man qsort:

The qsort_r() функция идентична QSort(), за исключением что сравнение функции сравнения принимает третий аргумент

Ваша функция сравнения принимает два аргумента.

Обновление: И настоящая причина аварии следующая. Вы переходите к элементам функции сравнения массива типа char[WORD_LENGTH], а не char*, как в примере man qsort. Таким образом, параметры, переданные в функцию сравнения, это p1 = & слов [_], который является указателем на сравниваемую строку. В то время как в случае указателей на символы это будет (char **), только указатель на указатель строки char /. Таким образом, отливки в строке strcmp(* (char * const *) p1, * (char * const *) p2); не нужны и вредны, потому что в вашем случае крайняя причина разыгрывания является причиной проблемы. Удалите их и оставьте только strcmp(p1, p2).
В качестве дополнительной заметки эта проблема снова подчеркивает разницу между объявлениями строковых массивов как char *[] и char [][].

+0

Я не понимаю ... Я скопировал эту функцию из руководства пользователя qsort. – mmswe

+0

Пример в 'man qsort' для' qsort' не 'qsort_r' –

+0

О, спасибо. Поэтому я должен перейти к 'static int cmpstringp (const void * p1, const void * p2, void * p3)' и просто не использовать p3. Правильно? – mmswe