6
==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;
}
4

2 に答える 2

10

argc内容を確認しましたargv[1]か??の入力として適切であるためにargv[1]、非であることが保証されていますか?数値ではないために、初期化されていない値を表すトラップ表現を返す可能性はありますか?NULLatoiatoiargv[1]

編集:完全なコードを見た後、私はそれが問題ではないことに気づきました、そしてあなたの診断は間違っています。問題はここにあります:が初期化されていないfor (i = 0; i <= count; i++) { sum += numbers[i]; }場合。これは、前のループでの最後の割り当ての後にカウントが増分されるためです。したがって、sum自体は初期化されていない値に依存するため、sumを出力するとメッセージが表示されます。おそらくあなたは意味しましたi == countnumbers[i]numbers[count]numbers[count] = i; count++;for (i = 0; i < count; i++) { sum += numbers[i]; }

于 2013-02-24T06:17:02.973 に答える
0

int limit = atoi(argv [1])最初にinit値で宣言してから、それを使用します。

于 2019-01-24T14:17:45.163 に答える