【问题标题】:Large array causing segmentation fault大数组导致分段错误
【发布时间】:2018-05-24 18:29:40
【问题描述】:

我写了一个带有以下指定约束的代码:

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

这是代码:

#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 .....永远持续下去......

【问题讨论】:

  • 请添加错误检查。您的程序不检查 scanf 结果或 malloc 结果。如果任何事情失败了,你的整个程序就会爆炸。
  • 大多数人更喜欢数组索引:cost[-i] 而不是指针杂耍:*(cost - i),主要是因为它更易于阅读。
  • 你没有使用堆栈空间,malloc使用堆空间,如果你想使用堆栈空间你必须声明一个数组变量而不是malloc。
  • *(cost - i) 看起来越界了。
  • 成本 - 我。改变它

标签: c


【解决方案1】:

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

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

学习调试的基础知识是程序员手中的真正好工具。这是一个示例教程视频:https://www.youtube.com/watch?v=9gAjIQc4bPU

【讨论】:

  • 虽然这是个好建议,但它不是问题的答案。
  • 你是对的,我决定这样回答,以将 OP 从随机猜测中拉出来,并驱使他找到一种可以帮助他找到合法答案的方法(正如 OP 自我回答他的问题所证明的那样他对分配大小问题的主要假设是错误的)
【解决方案2】:

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

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

提到的约束没有问题。

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2010-12-18
    • 2017-02-25
    相关资源
    最近更新 更多