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

时间:2015-05-25 18:05:22

标签: c

为什么这个问题不重复? 问题可以在scanf,因为它是由黑客提供的,我无法修改代码!此外,由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次&amp;我不明白我会在哪种情况下Segmentaion fault。任何人都可以帮助我了解我的代码中缺少哪种情况,为什么我会看到分段错误?

1 个答案:

答案 0 :(得分:1)

问题出在代码主要部分的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));
}