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

大数组引发Segmentation Fault,求问题排查与解决方法

问题分析与解决方案

嘿,我帮你排查了下代码里的问题,你遇到的Segmentation Fault根本不是数组规模过大导致的——代码里有个致命的指针越界错误,这才是罪魁祸首!先给你拆解问题,再给你修正后的代码:

核心错误点

  • 指针越界触发段错误:在purchase函数的循环里,你写了*(cost - i)。当i=0的时候没问题,但i>=1时,cost - i会指向数组内存起始地址的前方区域,这属于非法内存访问,直接触发段错误!你本来想访问数组的第i个元素,应该写成cost[i]或者*(cost + i)才对。
  • (次要问题)find_index函数的可读性可以优化:用数组下标cost[i]代替指针偏移*(cost+i),代码会更清晰,不容易出错。

修正后的完整代码

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

long find_index(long x, long *cost, long n, long used_index) {
    long i;
    for(i = 0; i < n; i++)
        // 用数组下标代替指针偏移,可读性更好
        if(cost[i] == x && i != used_index)
            return (i+1);
    return 0;
}

int purchase(long *cost, long n, long money) {
    long i, index;
    for(i = 0; i < n ;i++) {
        // 修正指针越界:把cost - i改成cost + i(或直接用cost[i])
        index = find_index((money - cost[i]), cost, n, i);
        if(index) {
            printf("%ld %ld\n", i+1, index);
            break;
        }
    }
    free(cost);
    return 0;
}

int main(void) {
    int t;
    long *cost, money, n, i;
    scanf("%d",&t);
    while(t > 0) {
        scanf("%ld",&money);
        scanf("%ld",&n);
        cost = (long *)malloc(n*sizeof(long));
        for(i = 0; i < n; i++)
            scanf("%ld", &cost[i]); // 这里也改成数组下标写法,更直观
        purchase(cost,n,money);
        t--;
    }
    return 0;
}

关于你疑问的补充说明

  1. 栈/堆空间扩展问题:你用malloc在堆上分配数组,堆空间远大于栈空间,只要n不是大到超出系统可用内存(比如几十上百万级别的元素),完全不需要扩展空间——你之前的问题和空间无关。
  2. 其他可能的故障诱因:如果后续还有段错误,要检查scanf的输入是否符合格式(比如输入的数字是否超出long的范围),不过当前代码的核心错误已经修正,应该能通过测试用例。

可选优化建议

当前代码的时间复杂度是O(n²),当n很大时(比如你测试用例里的2044),效率会比较低。可以用哈希表(比如用malloc创建一个存储值到下标的映射)把find_index的时间降到O(1),整体复杂度降到O(n),适合处理更大规模的输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:16:15