运行时错误 - SIGSEGV

时间:2016-06-30 14:02:38

标签: c arrays loops for-loop

我应该编写一个程序来添加数组元素,如果前一个元素为0,则从总和中删除元素,但是我得到的运行时错误为 SIGSEGV 。我怎么能解决这个错误。

#include <stdio.h>

int main()
{
    int i,arr[10],n,sum=0;

    scanf("%d",&n);

    for(i=0;i<n;i++)
    {
        scanf("%d\n",&arr[i]);
    }

    for(i=0;i<n;i++)
    {
        sum=sum+arr[i];
    }

    for(i=0;i<n;i++)
    {
        if(arr[i]==0)
        {
            sum=sum-arr[i-1];
        }
    }

    printf("%d",sum);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

在本声明中

sum=sum-arr[i-1];

当我等于0时,你试图访问数组之外​​的内存。

从scanf

的调用中删除换行符
scanf("%d\n",&arr[i]);
         ^^ 

如果您要求用户输入数组的元素数,那么您应该检查输入的数字是否小于或等于10。 我认为要求用户输入数组元素的数量是没有意义的。否则,如果编译器支持它,最好使用可变长度数组。

程序可以按以下方式查看

#include <stdio.h>

#define N   10

int main( void ) 
{
    int a[N];

    printf( "Enter %d elements: ", N );

    int n = 0;
    while ( n < N && scanf( "%d", &a[n] ) == 1 ) n++;

    long long sum = 0;

    for ( int i = 0; i < n; i++ )
    {
        if ( i + 1 == n || a[i+1] != 0 ) sum += a[i];
    }

    printf( "\nsum = %lld\n", sum );

    return 0;
}

例如,如果要输入以下数字序列

1 2 0 3 4 0 5 6 0 7

然后输出看起来像

Enter 10 elements: 1 2 0 3 4 0 5 6 0 7

sum = 16

答案 1 :(得分:1)

问题这是数组的大小。 您声明了大小为10的数组,如果用户输入的大小为100,则会出现此类运行时错误。 为避免此异常,只需在用户输入大小即

后声明数组
     scanf("%d",&n);
     int arr[n];