#include<stdlib.h>
#include<stdio.h>
#include<math.h>
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("%dn",sum[a]);
}
return 0;
}
我制作了该代码,该代码正在终端运行。
但是在黑客等级中它显示
输入(stdin)
2
2
5
您的输出(stdout)
~ no response on stdout ~
预期输出
9
225
编译器消息
Segmentation Fault
现在我该怎么办来解决问题。
您的变量是非初始化的。结果,您的程序调用不确定的行为。
例如,您不初始化n
,但然后声明int b[n]
。数组b
的大小是多少?没有人真正知道,因为n
具有垃圾价值。
首先弄清楚您的变量值应该是什么,然后开始编码。
数组索引从0开始,因此您的循环看起来不好。
更改此内容:
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]
不正确(这是不确定的行为)。
n
和b[n]
。
在嵌套的for
循环中,使用sum[a]=sum[a]+b[n];
,您正在使用尚未初始化的sum[a]
。它具有垃圾价值,结果是不确定的。
如果您希望用0
初始化sum
的所有元素,则可以做
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<in;n++)
{
//b[n]=1+7*(n-1)+6*(n-1)*(n-2)+(n-1)*(n-2)*(n-3);
b[n]=1+7*(n)+6*(n)*(n-1)+(n)*(n-1)*(n-2);
sum[a]=sum[a]+b[n];
}
请参阅演示。
您的问题在此行中:
int a,query,in,n,b[n],sum[a];
b[n]
是什么意思?和sum[a]
?假设您想拥有一种具有神奇的语言 生长阵列,则C是一个不好的选择。
在C语言阵列中是一种结构,其大小在编译时已知。无论如何,让我们假设您的编译器支持可怕的可变长度阵列的骇客。您可以这样做:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
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("%dn", sum[a]);
}
return 0;
}
注意更改:首先,您需要知道数组的大小,然后可以分配它。此外,我增加了数组的大小,以支持您从1起选择的选择。最后,我还将sum
数组的初始值归零