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

C语言实现大数数组求和时出现Segmentation fault问题求助

搞定HackerRank大数数组求和的段错误问题

今天你开始刷HackerRank的题,碰到了一道数组求和的题目,要求处理超大整数,结果自己写的代码触发了Segmentation fault,咱们一步步来解决这个问题。

先回顾下题目细节

  • 核心要求:计算并打印数组元素的和,注意部分整数可能非常大
  • 输入格式:

    第一行输入整数n,第二行输入n个空格分隔的数组元素

  • 输出格式:

    打印数组元素的整数和

  • 示例输入:
    5
    1000000001 1000000002 1000000003 1000000004 1000000005
    
  • 示例输出:
    5000000015
    
  • 关键提示:多个整数相加的结果可能超出普通int范围,C/C++里得用long long int存储求和结果

你的代码问题分析

你提交的代码里有好几处明显的错误,直接导致了段错误和计算异常:

  • scanf参数错误:scanf("%d" , n);这里必须传n的地址&n,不然scanf没法修改n的值,n会是一个随机的垃圾值,后续循环逻辑全乱了。
  • 数组越界访问:不管是输入还是求和循环,你都用了arr1[n],但数组的索引是从0到n-1的,arr1[n]已经超出了数组的内存范围,这是触发Segmentation fault的核心原因。
  • 循环条件错误:i <= n会让循环多执行一次,同样会访问到不存在的数组元素,加剧越界问题,应该改成i < n。
  • 求和变量未初始化:long long int arrcount ;没有初始化为0,直接累加会得到随机的垃圾值,结果肯定不对。
  • 输出格式符错误:printf("%li" , arrcount);对于long long int类型,标准的格式符是%lld,用%li可能会导致输出异常。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

int main (){
    int n ;
    // 把数组元素类型改成long long,避免输入超大整数时溢出
    long long int arr1[n];
    long long int arrcount = 0; // 初始化求和变量为0

    // 传n的地址给scanf,正确获取输入的n值
    scanf("%d" , &n);
    // 循环遍历0到n-1的索引,正确读取每个数组元素
    for(int i = 0; i < n; i++) {
        scanf("%lld" , &arr1[i]);
    }
    // 累加每个元素到求和变量
    for( int i = 0; i < n; i++) {
        arrcount += arr1[i];
    }
    // 用%lld输出long long类型的结果
    printf("%lld" , arrcount);
    return 0; // 加上return,让程序更规范
}

额外提醒:示例里的输入元素1000000001已经接近32位int的上限(2147483647),如果遇到更大的输入值,用int存储数组元素会溢出,所以把数组元素类型改成long long int是更稳妥的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:06