Ошибка сегмента при выделении памяти и установке значений для трехмерного массива - PullRequest
0 голосов
/ 27 января 2020

Я хочу создать массив из 26 массивов слов (чтобы отсортировать мои списки слов по первой букве), поэтому я считаю, что я выделил память соответствующим образом, но когда я пытаюсь выполнить тестовый прогон и установить случайное слово «привет», для каждой точки, в которой должно быть слово, он работает только для первых 5 букв, а затем возвращает установленную ошибку. Простите мой код или описание, я довольно новичок. HELP

Примечание: оба моих параметра определены во внешних функциях, wordArray - это массив слов в данном текстовом файле, numWordsPerLetter - это целочисленный массив, который содержит количество слов, начинающихся с каждой буквы алфавита.

char*** create_alphabetical_array(char** wordArray, int* numWordsPerLetter){

  char*** alphabeticalArrays;
  int i, j;

  alphabeticalArrays = malloc(sizeof(char**)*26);
  for (i = 0; i < 26; i++){
    printf("%d\n", numWordsPerLetter[i]+1);
    alphabeticalArrays[i] = malloc(sizeof(char*)*numWordsPerLetter[i]+1);
  }

  for (i = 0; i < 26; i++){
    for (j = 0; j < (numWordsPerLetter[i]+1); j++){
      printf("%d %d %d\n", i, j, numWordsPerLetter[i]+1); /* using to help debug */
      strcpy(alphabeticalArrays[i][j], "hi");
    }
  }

  return (alphabeticalArrays);
}

1 Ответ

1 голос
/ 27 января 2020

Как минимум эти 2 ошибки:

Неправильный размер элемента и неправильный n. alphabeticalArrays[i] - это char **, поэтому sizeof(int) - это неправильно. element_size * numWordsPerLetter[i]+1 должно быть element_size * (numWordsPerLetter[i]+1)

Лучше использовать p = malloc(sizeof *p * n), затем p = malloc(sizeof *(type-of p) * n). Проще кодировать правильно, просматривать и поддерживать.

// alphabeticalArrays[i] = malloc(sizeof(int)*numWordsPerLetter[i]+1);
alphabeticalArrays[i] = malloc(sizeof alphabeticalArrays[i][0] * (numWordsPerLetter[i]+1));
//                             ^---Element size--------------^   ^-------------N--------^    

strcpy(alphabeticalArrays[i][j], "hi"); завершается неудачно, поскольку alphabeticalArrays[i][j] не назначен указатель на выделенную память для строки "hi". @ Zelnes

alphabeticalArrays[i][j] = malloc(strlen("hi") + 1);

Альтернатива: исследование strdup().


Надежный код также проверяет, успешно ли выделены ресурсы.

p = malloc(n);
if (p == NULL) Handle_Failure();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...