C - Ошибка сегментации при выделении места для строк - PullRequest
0 голосов
/ 27 ноября 2011

Этот код должен, естественно, сортировать массив строк, и он выдает ошибку.К сожалению, я не знаю, какой ввод дает segfault, но я предполагаю, что segfault происходит при выделении памяти для строк.Максимальная длина строки составляет 9000000.

Вот она:

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

void
strsort(char **string, int left, int right) {
   char *comp, *temp;
   int i, j, p;
   while(left < right) {
       i = left;
       j = right;
       p = (left + right) / 2;
       comp = string[p];
       while(1) {
           while(i <= j && strcmp(string[i], comp) <= 0)
               i++;
           while(i <= j && strcmp(string[j], comp) > 0)
               j--;
           if(i > j)
               break;
           temp = string[i];
           string[i] = string[j];
           string[j] = temp;
           if(j == p)
               p = i;
           i++; j--;
       }
       string[p] = string[j];
       string[j] = comp;
       j--;
       if((j - left) < (right - i)) {
           strsort(string, left, j);
           left = i;
       } else {
           strsort(string, i, right);
           right = j;
       }
   }
}

void
ignore_line(void) {
   char c;
   while((c = getchar()) != '\n');
}

int
main(void) {
   enum 
   {
       L = 9000001
   };
   int n, i, j, len;
   char offset = 'a' - 'A';
   scanf("%d", &n); ignore_line();
   char **string = (char **)malloc(n * sizeof(char *));
   for(i = 0; i < n; ++i) {
       string[i] = (char *)malloc(L * sizeof(char));
       len = -1;
       while((string[i][++len] = getchar()) != '\n') {
           if(string[i][len] >= 'a')
               string[i][len] -= offset;
           else
               string[i][len] += offset;
       }
       string[i] = (char *)realloc(string[i], len + 1);
       string[i][len] = '\0';
   }
   strsort(string, 0, n - 1);
   for(i = 0; i < n; ++i) {
       j = 0;
       while(string[i][j] != '\0') {
           if(string[i][j] >= 'a')
               printf("%c", string[i][j] - offset);
           else
               printf("%c", string[i][j] + offset);
           ++j;
       }
       printf("\n");
   }
   return 0;
}

1 Ответ

1 голос
/ 28 ноября 2011

Первая ошибка сегмента генерируется в:

while(i <= j && strcmp(string[i], comp) <= 0)

Рассмотрим просто отправку char* в strsort вместо char** и сравнение экземпляров char.Большая часть вашего кода слишком сложна.

void
strsort(char* string, int left, int right) {
   char comp, temp;

См. Мою реализацию quicksort .

...