程序正在编写代码块但不是黑客级别

时间:2017-12-28 06:42:10

标签: c gcc

这段代码可以在codeblock中返回正确的输出,但不会在黑客等级上返回。我没有得到这个问题?

#include <stdio.h>

int main()
{
    int num,i;
    long long unsigned int *num_alloc, FinalSum = 0;
    num_alloc=(int*)malloc(sizeof(int)*num);
    scanf("%d",&num);
    for ( i=0;i<num;i++)
    {
        scanf("%llu",&num_alloc[num]);
        FinalSum =FinalSum + num_alloc[num];
    }
    printf("%llu",FinalSum);
    return 0;
}

3 个答案:

答案 0 :(得分:4)

让我们来看看您的代码:

  1. malloc(sizeof(int) * num)num的价值是什么?
  2. scanf("%d",num),检查scanf的返回值(scanf成功解析的元素数量)
  3. for( i = 0 ; i < num; i++ ),从i0
  4. 循环num
  5. scanf("%llu",&num_alloc[num]),读取数字并将其存储在num_alloc[num]中(C中的数组索引从0开始)
  6. FinalSum = FinalSum + num_alloc[num],将num_alloc[num]添加到FinalSum(参见#4)
  7. 结束循环
  8. 我提供了一些修改代码的建议。但是,您还需要存储在程序结束前读取的每个值吗?

    此外,&#39; malloc&#39;是#stdlib.h&#39;的功能。而且你没有包含那个头文件。

答案 1 :(得分:3)

在为num_alloc分配内存之前,必须初始化num变量。如果没有,num_alloc的内存将被分配一个垃圾箱大小,所以你有undefined behavior

答案 2 :(得分:2)

关于你的代码,有很多事情向我发出。当num未初始化时,您正在为num个整数分配内存。它被赋予一个未定义的垃圾值。见undefined behavior。你必须将你的scanf语句放在malloc之前,因为现在它的代码没有意义。

for ( i=0;i<num;i++)
{
    scanf("%llu",&num_alloc[num]);
    FinalSum =FinalSum + num_alloc[num];
}

对于每个循环迭代,您正在访问数组的num元素。这是不可能的,因为num_alloc应该是num整数的数组,并且C中的数组索引从0开始。但是我很确定你的意思是这个。使用您的代码,您可能会一遍又一遍地分配相同的值。

for (i = 0; i < num; i++) {
    scanf("%llu", &num_alloc[i]);
    FinalSum += num_alloc[i];
}

您还必须free()使用malloc()在堆上分配的任何内存。

free(num_alloc);