为什么C++代码i和a[i]在1-100区间仍触发SIGFPE算术异常?
错误触发原因
- 核心原因是数组下标越界访问导致除数为0,触发算术异常SIGFPE:
- 你定义的数组
a长度为n,合法下标范围是0 ~ n-1,但后续循环i取值为1 ~ 100,当i >= n时,a[i]访问的是数组外的非法内存,读取到的是不确定的垃圾值,大概率会出现0值,取模运算i % 0就会直接触发算术异常。 - 同理数组
b也存在同样的越界问题,当i >= m时访问b[i]也会读取到垃圾值,同样可能触发除数为0的异常。 - 你之前确认的「
a[i]取值在1~100之间」仅针对你主动输入的a[0] ~ a[n-1]的合法元素,越界访问的内存值不受这个限制。
- 你定义的数组
修复方案
首先明确常规业务逻辑:统计1~100中,同时满足「能被a数组元素整除」、「能整除b数组元素」的数字个数,修复代码如下:
#include <stdio.h> int main() { int n, m, count = 0; scanf("%d %d", &n, &m); int a[n], b[m]; for(int i = 0; i < n; i++) { scanf("%d", &a[i]); } for(int i = 0; i < m; i++) { scanf("%d", &b[i]); } for(int i = 1; i <= 100; i++) { int x = 0; // 遍历a数组合法下标范围判断 for(int j = 0; j < n; j++){ if(i % a[j] == 0){ x++; break; // 若要求能被所有a元素整除则删除该行 } } // 遍历b数组合法下标范围判断 for(int j = 0; j < m; j++){ if(b[j] % i == 0){ x++; break; // 若要求能整除所有b元素则删除该行 } } if(x == 2) count++; } printf("%d", count); return 0; }
- 修复要点:
- 不再直接用循环变量
i作为a、b数组的下标,改为单独遍历数组的合法下标范围访问元素,从根源避免越界问题。 - 将临时统计变量
x的定义放到1~100的循环内部,每次统计新数字时自动重置,简化冗余逻辑。
- 不再直接用循环变量
内容的提问来源于stack exchange,提问作者Yuv
相关产品推荐
相关产品推荐

