Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 运行时错误-SIGSEGV_C_Arrays_Loops_For Loop - Fatal编程技术网

C 运行时错误-SIGSEGV

C 运行时错误-SIGSEGV,c,arrays,loops,for-loop,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

如果前一个元素为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;
}
在这份声明中

sum=sum-arr[i-1];
当i等于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;
}
然后输出可以如下所示

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

sum = 16
在这份声明中

sum=sum-arr[i-1];
当i等于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;
}
然后输出可以如下所示

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

sum = 16

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

     scanf("%d",&n);
     int arr[n];

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

     scanf("%d",&n);
     int arr[n];

.@Pleote数组的索引从0开始。如果数组arr的大小在编译时是固定的,为什么要求用户输入n的值?您应该在这里使用宏。已读:.scanf%d\n,&arr[i];->扫描%d,&arr[i];printf%d,总和;->printf%d\n,sum@请注意数组的索引从0开始。如果数组arr的大小在编译时是固定的,为什么要求用户输入n的值?您应该在这里使用宏。已读:.scanf%d\n,&arr[i];->扫描%d,&arr[i];printf%d,总和;->printf%d\n,总和;如果数组的元素数由用户选择,那么如何在上面的程序@VIad from中声明数组长度Moscow@Pleotex如果编译器支持VLAs,那么您可以只编写int a[n];其中n是在声明之前输入的。@Plotex否则您可以使用malloc动态分配数组。如果数组的元素数是用户的选择,那么如何在上面的程序@VIad from中声明数组长度Moscow@Pleotex如果编译器支持VLAs,那么您可以只编写int a[n];其中n是在声明之前输入的。@Pleotex否则您可以使用malloc动态分配数组。