【问题标题】:Uninitialised value was created by a stack allocation未初始化的值是由堆栈分配创建的
【发布时间】:2013-02-24 05:40:51
【问题描述】:
==13890== Conditional jump or move depends on uninitialised value(s)
==13890==    at 0x4E7E4F1: vfprintf (vfprintf.c:1629)
==13890==    by 0x4E878D8: printf (printf.c:35)
==13890==    by 0x400729: main (001.c:30)
==13890==  Uninitialised value was created by a stack allocation
==13890==    at 0x400617: main (001.c:11)

被引用的行:

int limit = atoi(argv[1]);

我不知道如何解决它。我曾尝试在 stackoverflow 和 google 上搜索,但找不到解决方案。

代码(来自修订历史):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("You must pass a single integer\n");
        exit(1);
    }

    int limit = atoi(argv[1]); 
    int numbers[limit / 2];
    int count = 0;
    int i;
    for (i = 3; i < limit; i++) {
        if (i % 3 == 0 || i % 5 == 0) {
            numbers[count] = i;
            count++;
        }
    }

    int sum = 0;

    for (i = 0; i < count; i++) {
        sum += numbers[i];
    }

    printf("The sum is: %d\n", sum);

    return 0;
}

【问题讨论】:

  • 显示更多代码。问题。几乎可以肯定是在其他地方。
  • 第 30 行是 return 0;,并且没有理由让该行包含任何与 printf 相关的内容。我感觉这个 valgrind 输出与代码不同步。
  • 好像是@andrew。那时我一定错过了。不幸的是,原来的链接已经失效,所以我看不出有什么办法可以纠正这种情况。
  • 很遗憾代码被编辑为外部链接,该链接已变得陈旧,因此与问题无关。尽管对我来说是声誉的来源(见下文),但我将投票关闭(也许稍后会删除)它,因为它不可能对其他人有用。
  • 链接失效了,请提供导致问题的代码

标签: c valgrind


【解决方案1】:

您检查过argcargv[1] 的内容吗? argv[1] 是否保证为非NULL 以适合作为atoi 的输入?由于argv[1] 不是数字,atoi 是否有可能返回表示未初始化值的陷阱表示?

edit:看到完整的代码后,我意识到这不是问题所在,你的诊断是错误的。您的问题在这里:for (i = 0; i &lt;= count; i++) { sum += numbers[i]; }i == countnumbers[i] 未初始化。这是因为在上一个循环中最后一次分配给numbers[count] 之后计数会增加:numbers[count] = i; count++;。因此,打印 sum 会导致您的消息,因为 sum 本身取决于未初始化的值。也许你的意思是for (i = 0; i &lt; count; i++) { sum += numbers[i]; }

【讨论】:

  • 我传入“10”,如下所示:./001 10。此外,该程序确实有效,但我只想知道为什么会出现该错误。我将在链接中编辑完整代码。
  • 这修复了它!感谢您的帮助!
【解决方案2】:

int 限制 = atoi(argv[1]) 先用init值声明,再使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2011-01-11
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多