未初始化的值由堆栈分配创建

时间:2013-02-24 05:40:52

标签: c valgrind

==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和谷歌搜索,但我找不到解决方案。

代码(来自修订历史):

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

2 个答案:

答案 0 :(得分:10)

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

编辑:看到完整的代码后,我意识到这不是问题,而且您的诊断不正确。您的问题出在此处:for (i = 0; i <= count; i++) { sum += numbers[i]; }i == count时,numbers[i]未初始化。这是因为在上一次循环中numbers[count]的最后一次分配后,count会递增:numbers[count] = i; count++;。因此,打印总和会产生您的消息,因为总和本身取决于未初始化的值。也许你的意思是for (i = 0; i < count; i++) { sum += numbers[i]; }

答案 1 :(得分:0)

int限制= atoi(argv [1]) 首先用初始化值声明它,然后使用它。