Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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中的stdout~没有响应_C_Arrays_Segmentation Fault - Fatal编程技术网

~C中的stdout~没有响应

~C中的stdout~没有响应,c,arrays,segmentation-fault,C,Arrays,Segmentation Fault,您的输出标准输出 2 2 5 预期产量 ~ no response on stdout ~ 编译器消息 9 225 现在我该怎么做才能解决这个问题。您的问题在这一行: Segmentation Fault int main() { int a, query, in, n, *b, *sum; scanf("%d",&query); sum = malloc(query * sizeof(int)); /* do some checks i

您的输出标准输出

2

2

5
预期产量

~ no response on stdout ~
编译器消息

9

225

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

您的问题在这一行:

Segmentation Fault
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 */
b[n]是什么意思?和[a]之和?假设您想要一种具有神奇增长的数组的语言,那么C是一个糟糕的选择

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

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

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

您的变量未初始化。因此,您的程序调用未定义的行为

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

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

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

更改此项:

#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;
}
为此:

for(a=1;a<=query;a++)
在int a,query,In,n,b[n],sum[a];,a的值未初始化,并且具有垃圾值,垃圾值可以是任何值。此值用作可变长度数组和的大小。因此,数组的大小可以是任何可能不是您想要的大小

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

这同样适用于n和b[n]

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

如果希望sum的所有元素都用0初始化,可以这样做

for (a = 0; a < query; a++)
在申报时

b[n]=1+7*n-1+6*n-1*n-2+n-1*n-2*n-3也是如此;还有

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

int sum[20]={0};

参见。

b[n],和[a]?n和a未初始化。打开你的警告。数组是基于0的,所以循环也是无效的。@EugeneSh。你的意思是我应该定义什么是n和a,比如int a,n;不,我的意思是它们未初始化,即没有定义的值。@EugeneSh。那么我应该怎么做来解决这个问题呢?你需要在声明过程中给它们赋值,例如:int a=10,n=943;这仍然很糟糕,但比OP的代码要好。正如我所评论的,这只是向他展示想法,而不是实际的代码。我不去做他的家务我去见彼得,同意了。我用同样的逻辑给出了答案,你觉得怎么样+1对于你的。sizefint???@M.M对于一个应该知道CIt不起作用的人来说,这应该是很明显的打字错误,我的朋友。它不会改变任何事情。将scanf封装在变量声明之间不会有帮助。在函数条目上为它们分配空间。如果您的编译器支持代码块局部变量,那么它就可以工作,但需要以另一种方式编写scanf%d,&query;{int sum[query+1];…}-您需要将其包装到单独的代码块中。@PeterJ_01:标准说6.2.4.6对于这种具有可变长度数组类型的对象,其生存期从对象的声明开始,直到程序的执行离开声明的范围为止。因此,它们的空间不是在函数项上分配的,而是在它们的声明之后分配的。@PeterJ_01:在这里测试它。当然,它在不支持可变长度数组的编译器(如Microsoft C编译器)中不起作用。我不同意将VLAs称为可怕的黑客。几乎所有其他编程语言都有运行时数组大小,对该语言的这一改进有助于它走出恐龙时代。另外,您关于数组大小在编译时已知的说法是错误的,正如您的program@M.M:几乎所有其他编程语言都有运行时数组大小,不幸的是,可变长度数组大小在分配后无法更改。所以你得到了一个语言结构,它可以解决数组的一些问题,但还不够。而且是不可移植的,因为现在C11是一个可选特性。一旦定义了b[n],它就是未定义的行为。你的回答错误地说,这取决于什么是一个可以。垃圾值是垃圾值形式上的术语是不确定的,它不像滚动一个随机数,然后以定义明确的方式进行that@M.M你能解释一下吗?为什么它不能以不确定数组大小的适当方式进行呢?因为b[n]导致,这意味着程序不再包含在C的定义中language@M.M但这不是一个可变长度数组吗?这不合法吗?将一个具有不确定值的值声明为维度是不合法的
int sum[20]={0};
for (a = 0; a < query; a++) {
for (a = 1; a <= query; a++) 
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];
}