==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)
Run Code Online (Sandbox Code Playgroud)
引用的行:
int limit = atoi(argv[1]);
Run Code Online (Sandbox Code Playgroud)
我不知道如何解决它.我试过在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;
}
Run Code Online (Sandbox Code Playgroud)
aut*_*tic 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]; }