This question already has answers here:
segmentation fault using scanf with integer
                                
                                    (2个答案)
                                
                        
                                4年前关闭。
            
                    
为什么这个问题不是重复的?
问题不可能出在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中。

如果您查看文档,功能说明甚至会说:


  从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));
}

10-08 05:07