Ошибка при печати указателя на массив указателей символов - PullRequest
0 голосов
/ 26 февраля 2019
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sortString(char *s[], int count);

int main(){

        int i;
        char buff[BUFSIZ];

        int count;
       // 's' is a pointer to a char pointer, initially 's' is allocated storage for one char pointer
        char** s= malloc(sizeof(char*));

        printf("Here is the list of unsorted names: \n\n");

        // Keep on reading unlimited number of names until EOF (Ctrl + D) is reached
        for (count = 0; fgets(buff, sizeof(buff), stdin); count++){

           //Step 1: allocate sufficient storage for s[n] to store the content in buff plus one byte for '\0'
           s[count]=malloc(strlen(buff)+1);
           //Step 2: copy the contents of 'buf' to 's[n]'
           strcpy(s[count],buff);
//Step 3: resize the array of pointers pointed to by 's' to increase its size for the next pointer
          *s=realloc(*s,sizeof(char **)*count+2);
          printf("added to the array at s[%i] is : %s",count, s[count]);
        }

       // EOF reached. Now count the number of strings read

        printf("\nCount is %d\n\n", count);

       // Now sort string using sortString function

       // Step 4: implement sortString function for the above-mentioned function declaration
       //sortString(s, count);

       // Step 5: print the list of sorted names.
       int k;
       for(k=0; k<count; k++){
         printf("%s", s[k]);
       }
       // Step 6:free the allocated memory.

        return 0;
}

void sortString(char *s[], int count){
  char * temp;
  int j,k;

  for(j = 0; j < count -1; j++){
    for(k=j+1; k < count; k++){
      if(strncmp(s[k],s[k+1],1)>0){
        temp=s[k];
        s[k]=s[k+1];
        s[k+1] = temp;

      }

    }
  }

}

Полное раскрытие, это домашнее задание.

Идея такова: у нас есть указатель s, который указывает на большее количество указателей на символы, которые сами являются указателями на массив символов.Затем мы используем malloc для этих указателей, чтобы вписать строку, которую вводит пользователь, затем realloc s, чтобы вписать больше строк.

Кажется, что malloc и realloc в порядке.Я добавил строку, чтобы проверить, что я добавил для каждого индекса массива, и, кажется, он работает просто отлично.

Проблема возникает, когда я пытаюсь распечатать ее.Я получаю ошибку на шаге 5, в частности оператор printf.Похоже, что s [k] будет работать для любого положительного целого числа до 4, потому что оно вызывает ошибки, когда k больше 4.

Скомпилировано с использованием gcc -g, ubuntu 18.04 и windows 10. Все сталкиваются с одинаковой проблемой,

1 Ответ

0 голосов
/ 26 февраля 2019

Помимо исправления порядка операций @ chux, у вас также есть серьезная проблема с вашим оператором realloc.Вы делаете это:

*s = realloc(*s, ...)

Это означает, что вы не назначаете вновь выделенную память для s, вы перераспределяете и присваиваете отмененную ссылку s, по существу s[0].Это означает, что вы перераспределяете память, выделенную для вашей строки, а не для массива строк.

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

...