c - 分段错误: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 练习的一个稍微修改的例子
解决方案
有了这条线
int arr[MAX - MIN];
...您正在创建一个由 25 (122 - 97) 个整数组成的数组。有效的数组索引为 0 ... 24。
首先,由于每个数组单元专用于一个小写字母,因此数组应该有 26 个单元。
然后,使用此语句(以及下一个语句):
for (i = MIN; i <= MAX; i++) arr[i] = 0;
...您正在写入不存在的数组单元格,覆盖程序堆栈的其他部分arr[97]
。arr[122]
这就是你得到分段错误的原因。
推荐阅读
- javascript - 在地址栏中调用 localhost 后是否有运行 NodeJS 的模块
- .net-core - 如何将 Topshelf 与 .NET Core 2.1 应用程序一起使用?
- caption - Azure 媒体服务 v3 - 用于生成字幕的预设:Azure 媒体索引器 2 预览版
- scala - 如何存储数据框引用列表以供以后使用?
- spring-boot - SpringBoot @Configuration 和 @configurationProperties 的区别
- docker - 从 Golang-Webserver 控制 Docker
- iis-7 - 从 Outlook 2016 x64 连接的模拟错误
- python - 表达式“value.get()”返回多个相同的值
- java - 使用 Uri 创建文件后文件为空 - 改造
- datetime - SQL 从 3 周前获得最后更新的 DATETIME 字段