Ошибка сегментации: 11 для небольшой программы на C на macOS 10.14 Mojave - PullRequest
0 голосов
/ 29 сентября 2018

Я не уверен, почему я получаю Segmentation Fault: 11 при попытке скомпилировать этот маленький C-файл:

#include <stdio.h>

#define MIN  97
#define MAX  122
#define DIFF 32

int main()
{
  int c = EOF;
  int i, j;
  int arr[MAX - MIN];

  for(i=MIN; i<=MAX; i++)
    arr[i] = 0;

  while((c = getchar()) != EOF) {
    if(c >= MIN)
      ++arr[c];
    else
      ++arr[c + DIFF];
  }

  for(i=MIN; i<=MAX; i++) {
    printf("|%c|", i);
    for(j=1; j<=arr[i]; j++)
      putchar('-');
    putchar('\n');
  }
  return 0;
}

Я использую встроенный в Apple cc, который просто Clang /Apple LLVM 10.0.0

Этот файл прекрасно компилируется на macOS 10.13.6, и у меня нет проблем с компиляцией любых других файлов / программ на C на 10.14;это просто один файл.С моей точки зрения начинающего, это похоже на ошибку в ОС.

РЕДАКТИРОВАТЬ: Эта программа является слегка измененным примером из упражнения K & R, которое я нашел здесь

1 Ответ

0 голосов
/ 29 сентября 2018

С этой строкой

int arr[MAX - MIN];

... вы создаете массив из 25 (122 - 97) целых чисел.Допустимые индексы массива: 0 ... 24.

Прежде всего, поскольку каждая ячейка массива выделена строчной букве, массив должен иметь 26 ячеек.

Затем с помощью этого оператора(и следующие тоже):

for (i = MIN; i <= MAX; i++) arr[i] = 0;

... вы записываете в несуществующие ячейки массива arr[97] до arr[122], перезаписывая другие части стека программы.Вот почему вы получаете ошибку сегментации.

...