программа сбоя qsort - C - PullRequest
       15

программа сбоя qsort - C

2 голосов
/ 27 августа 2009

Пытается следовать этому примеру. (Раздел Сортировка строк ...)
Есть ли что-нибудь очевидное, что могло бы вызвать этот сбой в qsort.c в stdlib?
Я также попытался cstring_cmp с strncmp, указав максимум 30 символов, что намного больше, чем у меня.
* fileArray [20], кажется, правильно заполнен строками.
Благодарю.

char* ptr_fileName;  
char* fileArray[20];//number of files  
size_t strings_len;  

ptr_fileName = (char*)malloc((strlen(FindFileData.cFileName)+1)*sizeof(char));
memcpy(ptr_fileName, FindFileData.cFileName, strlen(FindFileData.cFileName)+1);
fileArray[i] = ptr_fileName;



strings_len = sizeof(fileArray) / sizeof(char *);          
qsort(fileArray, strings_len, sizeof(char *), cstring_cmp);   
//crashing in qsort.c

Функция сравнения c-строки qsort:

/* qsort C-string comparison function */
    int cstring_cmp(const void *a, const void *b)
    {
        const char **ia = (const char **)a;
        const char **ib = (const char **)b;
        return strcmp(*ia, *ib);
        /* strcmp functions works exactly as expected from
        comparison function */
    }

Ответы [ 5 ]

4 голосов
/ 27 августа 2009

Вы говорите, что заполняете fileArray только 10 строками, оставляя 10 записей неинициализированными.

Когда вы вызываете qsort, вы передаете 20 в качестве аргумента strings_len. Это, конечно, приведет к неопределенному поведению.

Вы должны предоставить qsort точную информацию.

Если вы передаете 10 строк в массиве, вы также должны передать число 10 как количество элементов, которые должны быть отсортированы.

Примечание: Если вы последуете моему предыдущему ответу, установив точку останова на cstring_cmp, вы быстро увидите, когда вызывается метод сравнения с недопустимыми данными, что приводит непосредственно к падению.

2 голосов
/ 27 августа 2009

Установите точку останова в cstring_cmp и наблюдайте, как она вызывается каждый раз.

Проверьте, происходит ли окончательный сбой внутри cstring_cmp или в qsort.Проверьте состояние fileArray непосредственно перед сбоем.

2 голосов
/ 27 августа 2009

Как вы населяете:

char* fileArray[20];

в нынешнем виде это массив неинициализированных указателей.

1 голос
/ 27 августа 2009

* fileArray [20], кажется, правильно заполнен строками.

Звездочка перед fileArray заставляет меня сомневаться в правильности заполнения массива. Я не вижу ничего другого, что могло бы сломать ваш код.

0 голосов
/ 27 августа 2009

Поскольку вы не инициализируете содержимое файла fileArray, оно содержит случайную память, а не юридические указатели на символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...