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

CodeChef题目COUNTP提交出现SIGSEGV运行时错误求助

排查CodeChef COUNTP问题代码的SIGSEGV错误

我在解决CodeChef的COUNTP问题时,编写了如下C语言代码:

#include <stdio.h>

int main(void) 
{
    int T,A[100];
    scanf("%d",&T);
    
    while(T--)
    {
        int N,sum=0,rem;
        scanf("%d",&N);
        for(int i = 0 ; i<N ; i++)
        {
            scanf("%d",&A[i]);
        }
        
        for(int i = 0 ; i<N ; i++)
        {
            sum+=A[i];
        }
        
        rem=sum%2;
        if(rem==1)
        printf("NO\n");
        if(rem==0)
        printf("YES\n");
    }
    return 0;   
}

变量说明

  • T:测试用例数量
  • A:输入数字组成的数组,初始化大小为100
  • N:输入数组的实际大小
  • sum:数组元素的和,初始化为0

样例输入

4
4
1 1 2 2
6
1 2 4 6 8 10
2
3 5
3
1 3 5

样例输出

YES
NO
YES
NO

本地IDE运行该代码时能得到符合要求的样例输出,但提交至CodeChef平台后出现SIGSEGV运行时错误,检查代码未发现问题,请求帮助排查原因。


错误原因分析

SIGSEGV(段错误)的核心原因是数组访问越界。你定义的数组A大小固定为100,但如果题目测试用例中N的取值超过100(比如题目允许N的最大值为10^5或更大),当循环执行到i >= 100时,A[i]会访问数组范围外的内存,触发系统的内存保护机制,导致段错误。

本地测试用例的N都小于等于100,所以不会触发问题,但平台的测试用例包含更大的N值,才会暴露这个漏洞。

解决方案

你完全不需要保存整个数组——因为问题只需要计算元素和的奇偶性,直接在输入时累加即可,既节省内存又彻底避免越界问题。优化后的代码如下:

#include <stdio.h>

int main(void) 
{
    int T;
    scanf("%d", &T);
    
    while(T--)
    {
        int N, sum = 0, num;
        scanf("%d", &N);
        // 输入时直接累加,无需数组存储
        for(int i = 0; i < N; i++)
        {
            scanf("%d", &num);
            sum += num;
        }
        // 简化判断逻辑
        printf(sum % 2 == 0 ? "YES\n" : "NO\n");
    }
    return 0;
}

如果一定要使用数组,可以改用动态内存分配,根据每个测试用例的N来分配空间:

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

int main(void) 
{
    int T;
    scanf("%d", &T);
    
    while(T--)
    {
        int N, sum = 0, rem;
        scanf("%d", &N);
        // 动态分配数组
        int *A = malloc(N * sizeof(int));
        if(A == NULL) // 检查内存分配是否成功
        {
            printf("Memory allocation failed\n");
            return 1;
        }
        
        for(int i = 0; i < N; i++)
        {
            scanf("%d", &A[i]);
            sum += A[i]; // 输入时同时累加,减少一次循环
        }
        
        rem = sum % 2;
        printf(rem == 0 ? "YES\n" : "NO\n");
        
        free(A); // 释放内存,避免内存泄漏
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:17:37