我编写了一个包含以下指定约束的代码:
因此我相应地为我的变量选择了数据类型。 但是我的代码在所有测试用例中都没有说出分段错误。 (可能是因为它们输入的数组大小非常大。)有没有办法获得更多的堆栈空间或堆空间?或通过以其他方式声明数组来解决这个问题?是否有其他因素导致分段错误?其他人已经解决了这个问题,所以必须有办法。
这是代码:
#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 .....永远持续......
答案 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);
提到的限制因素没有问题。