我不确定为什么在尝试编译这个小 C 文件时会Segmentation Fault: 11
:
#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练习的稍微修改的例子
用这行
int arr[MAX - MIN];
。您正在创建一个包含 25 (122 - 97( 个整数的数组。有效的数组索引为 0 ...24.
首先,由于每个数组单元专用于一个小写字母,因此数组应该有 26 个单元格。
然后,有了这个声明(以及下一个(:
for (i = MIN; i <= MAX; i++) arr[i] = 0;
。您正在写入arr[97]
到不存在的arr[122]
的数组单元格中,从而覆盖程序堆栈的其他部分。这就是您遇到分段错误的原因。