简体   繁体   中英

C - Segmentation Fault when allocating space for strings

This code must naturally sort an array of strings and it gives a segfault. Unfortunately, I don't know what input it gives segfault on, but I suppose that segfault occurs when allocating memory for strings. Maximum string length is 9000000.

Here it is:

#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;
}

The first seg fault is thrown at:

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

Consider simply sending a char* to strsort , instead of char** , and comparing instances of char . Much of your code is overcomplicated.

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

See my quicksort implementation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM