【问题标题】:Program is working on code block but not in hacker rank程序正在处理代码块但不在黑客级别
【发布时间】:2018-06-08 17:26:30
【问题描述】:

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

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

【问题讨论】:

  • 告诉我,num当你使用malloc时的价值是多少?
  • 嗯,我不知道,但在与鸭子交谈后(见:How to debug small programs),我仍然无法回答——但我知道这不可能……
  • 启用所有警告和调试信息,gcc -Wall -Wextra -g。你会收到几个警告。改进您的代码以获得无。阅读 scanf 的文档 - 它返回一个您应该使用的项目计数 - 和 malloc - 它可能会失败 - ...然后使用调试器 gdb
  • @Barmak Shernirani:long long unsigned int 是合法的,但可以写成unsigned long long。它至少是 64 位,但你不应该关心它是否更大(而且我不知道发生这种情况的 C 实现)。你也可以使用&lt;stdint.h&gt;中的uint64_t
  • @Bathsheba - 别傻了。 Haxor 不要free

标签: c gcc


【解决方案1】:

让我们来看看你的代码:

  1. malloc(sizeof(int) * num)num 的值是多少?
  2. scanf("%d",num),查看scanf的返回值(scanf解析成功的元素个数)
  3. for( i = 0 ; i &lt; num; i++ ),循环使用 i0num
  4. scanf("%llu",&amp;num_alloc[num]),读取数字并将其存储在num_alloc[num]中(C中数组的索引从0开始)
  5. FinalSum = FinalSum + num_alloc[num],将num_alloc[num] 添加到FinalSum(参见#4)
  6. 结束循环

我提供了一些建议来修复您的代码。但是您是否还需要存储每个读取的值直到程序结束?

另外,'malloc' 是 'stdlib.h' 的一个函数,你没有包含那个头文件。

【讨论】:

  • 首选for( int i = 0 ; i &lt; num; i++ )?
  • @Bathsheba 我只是复制源代码行,而不是重写问题中的代码
【解决方案2】:

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

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

对于每个循环迭代,您都在访问数组的 numth 元素。这是不可能的,因为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);

【讨论】:

  • 我要补充一点,在这种情况下freeing 不是完全必要的(程序结束,资源被操作系统回收),但被认为是一种好的做法。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多