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

标签 c segmentation-fault

这段代码必须自然地对字符串数组进行排序,并且它会给出段错误。不幸的是,我不知道它会在什么输入上产生段错误,但我认为在为字符串分配内存时会发生段错误。最大字符串长度为 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;
}

最佳答案

第一个段错误抛出于:

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

考虑简单地将 char* 发送到 strsort,而不是 char**,然后比较 char 的实例>。您的大部分代码都过于复杂。

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

查看我的quicksort实现。

关于C - 为字符串分配空间时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288281/

相关文章:

c - 我的程序出现段错误

c - C中的3d字符数组问题

c - postfix 计算器遇到段错误问题

c - SHA256 使用 Openssl 导致段错误

c++ - 将未签名的char Buffer拆分并存储到结构中

c - 使用条件

c - 如何在C中的字符串中插入一个额外的字符

c - 为什么下面的 do-while 循环有效?

c - 为什么即使使用 fprintf 将输入传递给文件指针,输入也没有写入文件?

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"