为什么我在C中出现分段错误?

为什么这个问题不重复? 问题不能在scanf ,因为它是由hackerrank给出的,我无法修改代码! 此外,由hackerrank提供的测试用例是自动化的。 我们可以通过输入阅读来信任他们。 我的逻辑中有一些错误在数组中找到两个元素,但是找不到它:|

注意:我不能修改main方法,如前所述。 重新迭代它。 为什么我不能修改? 这是因为该方法是由门户网站给出的。 我无法改变它。 它读取输入并通过一些自动脚本调用我的方法,我无法控制它。 所以,请不要告诉我修改main方法。

我正在用C语言尝试hackerrank中的一些练习问题,并且一些测试用例开始为下面的问题抛出Segmentation fault 。 我已经尝试了解它超过2个小时了,并且想不出任何会导致segmentation fault测试用例。 我卡住了:|

问题陈述:

给定一个数组和一个数字。 查找数组中是否有2个元素,其总和等于给定数字。 如果存在数字则返回1,否则返回0。

很简单,对吧? 我的想法是一样的,编码如下,

 int compFunc (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int isSumPossible(int a[], int L, int N ){ /*L: Length of the array */ if(a==NULL) return 0; if(L<=1) return 0; int left=0, right=L-1; qsort(a,L,sizeof(int),compFunc); while(left<right) { if(a[left]+a[right]==N) return 1; else if(a[left]+a[right]<N) left++; else right--; } return 0; } int main() //given by hackerrank, I can't modify main method { int N; scanf("%d", &N); //fixed &N - it was correctly given in code, I missed it while typing it here. int a[100004], i=0; //read input into array a, based on N int x;scanf("%d", &x); //fixed &x - it was correctly given in code, I missed it while typing it here. printf("%d", isSumPossible(a,N,x)); } 

请假设包含所有必需的头文件。 现在,当我运行代码时,大多数测试用例都通过了,对于某些测试用例,它们显示了Segmentation fault 。 不幸的是,我看不到测试用例:|。 我已经完成了我的代码超过10次并且我不明白在哪种情况下我会得到Segmentaion fault 。 任何人都可以帮助我了解我的代码中缺少哪种情况,为什么我会看到分段错误?

问题出在代码主要部分的scanfs中。

如果你看一下文档,function描述甚至会说:

从stdin读取数据并根据参数格式将它们存储到附加参数指向位置

这意味着你必须给它一个内存地址来写入数据。 通过在主体中添加&和两个整数变量,问题就解决了。

 int main() { int N; scanf("%d", &N); int a[100004], i=0; //read input into array a, based on N int x;scanf("%d", &x); printf("%d", isSumPossible(a,N,x)); }