〜对于stdout~对C没有反应

时间:2017-09-28 18:40:22

标签: c arrays segmentation-fault

#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("%d\n",sum[a]);
    }       
    return 0;
}

我已经制作了在终端中运行的代码。

但是在黑客排名中它正在显示

输入(stdin)

2

2

5

你的输出(标准输出)

~ no response on stdout ~

预期产出

9

225

编译器消息

Segmentation Fault

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

4 个答案:

答案 0 :(得分:2)

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

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

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

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

改变这个:

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

到此:

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

答案 1 :(得分:1)

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 */

答案 2 :(得分:0)

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<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];
}

请参阅demo

答案 3 :(得分:-1)

你的问题在这一行:

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("%d\n", sum[a]);
    }

    return 0;
}

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