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:输入数字组成的数组,初始化大小为100N:输入数组的实际大小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
相关产品推荐
相关产品推荐

