C 运行时错误-SIGSEGV
如果前一个元素为0,我应该编写一个程序来添加数组元素并从总和中删除元素,但是我得到的运行时错误是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
#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动态分配数组。