You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么C++代码i和a[i]在1-100区间仍触发SIGFPE算术异常?

错误触发原因
  • 核心原因是数组下标越界访问导致除数为0,触发算术异常SIGFPE:
    1. 你定义的数组a长度为n,合法下标范围是0 ~ n-1,但后续循环i取值为1 ~ 100,当i >= n时,a[i]访问的是数组外的非法内存,读取到的是不确定的垃圾值,大概率会出现0值,取模运算i % 0就会直接触发算术异常。
    2. 同理数组b也存在同样的越界问题,当i >= m时访问b[i]也会读取到垃圾值,同样可能触发除数为0的异常。
    3. 你之前确认的「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;
}
  • 修复要点:
    1. 不再直接用循环变量i作为a、b数组的下标,改为单独遍历数组的合法下标范围访问元素,从根源避免越界问题。
    2. 将临时统计变量x的定义放到1~100的循环内部,每次统计新数字时自动重置,简化冗余逻辑。

内容的提问来源于stack exchange,提问作者Yuv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:48:02