首页 > 解决方案 > 分段错误:macOS 10.14 Mojave 上的小型 C 程序为 11

问题描述

我不确定为什么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 上编译得很好,我在 10.14 上编译任何其他 C 文件/程序没有任何问题;这只是一个文件。从我初学者的角度来看,这似乎是操作系统的一个错误。

编辑:这个程序是我在这里找到的 K&R 练习的一个稍微修改的例子

标签: csegmentation-fault

解决方案


有了这条线

int arr[MAX - MIN];

...您正在创建一个由 25 (122 - 97) 个整数组成的数组。有效的数组索引为 0 ... 24。

首先,由于每个数组单元专用于一个小写字母,因此数组应该有 26 个单元。

然后,使用此语句(以及下一个语句):

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

...您正在写入不存在的数组单元格,覆盖程序堆栈的其他部分arr[97]arr[122]这就是你得到分段错误的原因。


推荐阅读