〜没有对stdout的反应〜在C

#include #include #include int main() { int a,query,in,n,b[n],sum[a]; sum[1]=0; scanf("%d",&query); for(a=1;a<=query;a++) { scanf("%d",&in); for(n=1;n<=in;n++) { b[n]=1+7*(n-1)+6*(n-1)*(n-2)+(n-1)*(n-2)*(n-3); sum[a]=sum[a]+b[n]; } } for(a=1;a<=query;a++) { printf("%d\n",sum[a]); } return 0; } 

我已经制作了这个在终端上运行的代码。

但是在黑客排名中它显示出来了

输入(stdin)

 2 2 5 

你的输出(标准输出)

 ~ no response on stdout ~ 

预期产出

 9 225 

编译器消息

 Segmentation Fault 

现在我该怎么做才能解决问题。

您的变量未初始化。 因此,您的程序将调用Undefined Behavior

例如,您不初始化n ,但是然后声明int b[n] 。 数组b的大小是多少? 没人知道,因为n有垃圾值。

首先弄清楚变量的值应该是什么,然后开始编码。


数组索引从0开始,因此你的for循环看起来不太好。

改变这个:

 for(a=1;a<=query;a++) 

对此:

 for (a = 0; a < query; a++) 
 int main() { int a, query, in, n, *b, *sum; scanf("%d",&query); sum = malloc(query * sizeof(int)); /* do some checks if the malloc was successful */ for(a = 0; a < query; a++) { scanf("%d",&in) ; /* you should check if scan has returned 1 */ b = malloc(in * sizeof(int)); /* and again check against any allocation errors */ for(n = 0; n < in; n++) { b[n] = 1+7*(n)+6*(n)*(n-1)+(n)*(n-1)*(n-2); sum[a] = sum[a] + b[n]; } free(b); } /* the rest */ 

int a,query,in,n,b[n],sum[a]; ,a的值没有初始化,并且具有可以是任何东西的垃圾值。 该值用作可变长度数组sum的大小。 所以数组的大小可能是你想要的任何东西。

a可以是0在这种情况下, sum是一个大小为0的数组,这反过来会使sum[1]不正确(它将是未定义的行为)。

这同样适用于nb[n]

在嵌套的for循环中, sum[a]=sum[a]+b[n]; 您正在使用尚未初始化的sum[a] 。 它有垃圾值,结果是不确定的。

如果你想将sum所有元素初始化为0 ,那么你可以这样做

 int sum[20]={0}; 

在宣布时。

b[n]=1+7*(n-1)+6*(n-1)*(n-2)+(n-1)*(n-2)*(n-3); 同样。

并且数组索引从0开始。 也许你可以像使用循环一样

 for (a = 0; a < query; a++) { 

代替

 for (a = 1; a <= query; a++) 

如果选择起始索引为0 ,则内部嵌套循环应该是这样的

 for(n=0;n 

见演示 。

你的问题在于这一行:

 int a,query,in,n,b[n],sum[a]; 

b[n]是什么意思? sum[a] ? 假设你想拥有一个神奇增长的数组语言,C是一个糟糕的选择。

在C语言中,数组是一个在编译时已知大小的结构。 无论如何,让我们假设您的编译器支持可变长度数组的可怕黑客。 你可以这样做:

 #include  #include  #include  int main(void) { int a, query, in , n; scanf("%d", &query); int sum[query+1]; for (a = 1; a <= query; a++) { sum[a] = 0; scanf("%d", &in); int b[in+1]; for (n = 1; n <= in ; n++) { b[n] = 1 + 7 * (n - 1) + 6 * (n - 1) * (n - 2) + (n - 1) * (n - 2) * (n - 3); sum[a] = sum[a] + b[n]; } } for (a = 1; a <= query; a++) { printf("%d\n", sum[a]); } return 0; } 

请注意更改:首先您需要知道数组的大小,然后您可以分配它。 此外,我增加了数组的大小,以支持从1开始的选择。最后,我还将sum数组的初始值归零。