C - 分段在为字符串分配空间时出错

时间:2011-11-27 19:18:06

标签: c segmentation-fault

此代码必须自然地对字符串数组进行排序,并提供段错误。不幸的是,我不知道它给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 个答案:

答案 0 :(得分:1)

第一个seg故障被抛出:

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

只需将char*发送到strsort,而不是char**,并比较char的实例。你的大部分代码都过于复杂。

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

请参阅我的quicksort实施。