测试用例中的分段错误

Posted

技术标签:

【中文标题】测试用例中的分段错误【英文标题】:Segmentation fault in test cases 【发布时间】:2016-01-26 09:33:17 【问题描述】:

所以,问题如下: 给定任何整数数组(相当大),返回数组中任意两个元素之间的最大差异,使得较大的元素出现在比较小元素更高的索引处。如果没有找到这样的对,则返回 -1。 示例:

7 2 3 10 2 4 8 1

其中第一个元素是数组的大小(或输入的行数),其余元素是元素。 以上样本输出为 8(10-2)。

我的代码如下:

int A[20],size;

scanf("%d",&size);
for(int i=0;i<size;i++)
scanf("%d\n",&A[i]);

int diff = A[1]-A[0];
int currsum = diff;
int maxsum = currsum;

for(int i=1; i<size-1; i++)

    // Calculate current difference for the loop
    diff = A[i+1]-A[i];

    // Calculate current sum for the loop
    if (currsum > 0)
       currsum += diff;
    else
       currsum = diff;

    // Update max sum(if needed)
    if (currsum > maxsum)
       maxsum = currsum;


printf("%d",maxsum);

这是来自 Hackerrank 的一个问题,但它仅适用于 10 个可能的测试用例中的三个。其余情况返回分段错误。任何想法都会有所帮助。

【问题讨论】:

size 的最大限制是 20? 最大大小为 1,000,000。元素的最大大小为 1,000,000,最小为 -1,000,000。 所以你有一个只能包含 20 个整数的数组,而你的程序最多可以接收 百万 个整数? 那你为什么声明A的大小为20?我的最佳猜测是,其余 7 个测试用例的大小超过 20。 哦。认为我也应该阅读约束。我的错。热烈感谢@JoachimPileborg。 【参考方案1】:

如 cmets 中所述,您已声明 A 仅包含 20 个整数。但问题最多可以发送 1,000,000 个整数。错了!

【讨论】:

【参考方案2】:

使用指针使这一点更加重要。首先将A 声明为整数指针,然后读取数组的第一个元素,使用该整数可以为数组A 动态分配内存(malloc()calloc() 函数)。所以A 的大小是动态的,你可以根据第一个元素调整它的大小。

【讨论】:

以上是关于测试用例中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在代码中的 Chech 括号中的测试用例中得到错误的输出

未捕获的错误:useNavigate() 只能在赛普拉斯单元测试用例中的 <Router> 组件的上下文中使用

测试用例中的细节

如何模拟酶测试用例中的拖放?

使用 Java 反射访问测试用例中的受保护方法

plpgsql 测试用例中的 SELECT 查询未返回数组