大阵列导致分段错误

时间:2018-05-24 18:29:41

标签: c

我编写了一个包含以下指定约束的代码:

enter image description here

因此我相应地为我的变量选择了数据类型。 但是我的代码在所有测试用例中都没有说出分段错误。 (可能是因为它们输入的数组大小非常大。)有没有办法获得更多的堆栈空间或堆空间?或通过以其他方式声明数组来解决这个问题?是否有其他因素导致分段错误?其他人已经解决了这个问题,所以必须有办法。

这是代码:

#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++)
    {
        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;
}

这是他们检查的隐藏测试用例之一:

35 //这是t

299701136 //这是钱

2044 //这是n

50293811 136626876 58515785 59281065 .....永远持续......

2 个答案:

答案 0 :(得分:1)

需要分析很多复杂的代码,所以我不会给你一条鱼,而是试着给你一根鱼。

无论您使用何种平台,编译器和IDE,都可能有一种方法可以在运行时逐步调试程序。也许你的假设是错误的,分配大小不会导致这个问题。

学习调试的基础知识对于程序员而言是非常好的工具。以下是示例教程视频:https://www.youtube.com/watch?v=9gAjIQc4bPU

答案 1 :(得分:1)

代码中的这些更改修复了数组索引越界问题,因此出现了分段错误问题:

if((money - *(cost + i)) < n)
        index = find_index((money - *(cost + i)),cost,n,i);

提到的限制因素没有问题。