1

私はCに非常に慣れていないので、単純な部分配列追加プログラムを再作成できるかどうかを試してみました(配列内の最大の連続部分配列を見つけます)。nを整数として定義し、それを for ループの条件として使用すると、完全なジャンクが返されるという奇妙な問題に遭遇しました。

この奇妙なコードを許してください。私はほとんど、いじっていたファイルをコピーして貼り付けただけです(余分なprintfsなどがたくさんあります)。これを実行すると、for ループ内の printf 呼び出しごとに、"4196053" などの出力が得られます。最初のprintf呼び出し(ループに入る前)でも、めちゃくちゃになっているようです。

#include <stdio.h>

int maxI (int a, int b)
{
        int max = (a >= b) ? a : b;
        return max;
}


int main (void)
{
    int array[] = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
    int n = 11;
    int maxSoFar, i = 0;
    int maxHere = 0;
    printf ("%i\n", maxSoFar); //why is it screwing up here?

    for (i = 0; i < n; i++) {
            printf ("%i\n", maxSoFar);
            maxHere = maxI(maxHere + array[i], 0);
            maxSoFar = maxI(maxSoFar, maxHere);
    }
    printf ("The max is %i.\n", maxSoFar);
    return 0;
}

変数の代わりに条件で 11 を使用すると、正常に動作します。ここで何が起こっているか知っている人はいますか?

4

4 に答える 4

1

maxSoFarには任意のデータがあるため、最初に初期化する必要があります

int maxSoFar = 0, i = 0;
     ^^Initialize to zero
于 2013-09-05T02:23:30.300 に答える
0

あなたのエラーはここにあります

int maxSoFar, i = 0

maxSoFar を宣言したことがないため、ガベージ データを使用しています。

それを 0 に初期化すると、うまくいくはずです。

于 2013-09-05T02:23:24.063 に答える
0

初期化しないため、ガベージ値が返されますmaxSoFar。これは、その時点でメモリに残っていたものの値を持つことを意味します。

于 2013-09-05T02:26:01.620 に答える