1

私のCには、理解できない動作があります。

次のように配列を定義しました

long gainT1[21];

その変数を使用していくつかの作業を行います(したがって、初期化は必要ありません)。後で、変数に含まれる値を表示したいと思います。ここで問題が発生します: 2 番目の for によって表示される最初の値は、期待されるものではありません!

printf("CHECKING: gainT1[0]=%ld\n", gainT1[0]);
{
    ptrdiff_t k;
    for(k = 0; k < 16; k++) printf("[%td]=%ld   ", k, gainT1[k]); printf("\n");
    for(k = 0; k < 17; k++) printf("[%td]=%ld   ", k, gainT1[k]); printf("\n"); // Here the for is going up to 16 instead of 15 previously
}

このコードは次を返します。

チェック: gainT1[0]=4207440

[0]=4207440 [1]=4207440 [2]=4294967295 [3]=139846275105333 [4]=16351504 [5]=0 [6]=139846268659528 [7]=139846277253568 [8]=16351504 [9]=3 [10]=128 [11]=139846277252304 [12]=4294967295 [13]=139846272645590 [14]=0 [15]=0

[0]=2356216002 [1]=4207440 [2]=4294967295 [3]=139846275105333 [4]=16351504 [5]=0 [6]=139846268659528 [7]=139846277253568 [8]=163515304 [9]=163515304 [10]=128 [11]=139846277252304 [12]=4294967295 [13]=139846272645590 [14]=0 [15]=0 [16]=6312008

コードの何が問題なのかわかりません。

4

3 に答える 3

1

" I do some work with that variable " は未定義です。for ループで、実際にはまだ定義されていない要素にアクセスしている場合、奇数の値が表示されるなど、あらゆることが発生する可能性があります。

したがって、最も簡単な方法は次のとおりです。

long gainT1[21] = { 0 };

設定されていない値は、少なくともゼロになります。

(注: この配列の初期化が c99 で機能することは知っています。たとえば、c89 や c90 についてはわかりません。)

于 2012-12-03T10:56:38.577 に答える
0

問題がどこかにあるはずだということを理解してくれたので、できるだけ多くの行を削除する新しいプロジェクトを作成しました。これは初期化の問題のようです。配列が適切に初期化されていないため、値が安定していません。問題が発生するかどうかはコンパイルオプションに依存するため、役に立たないと思われる場合でも、常に変数を適切に初期化することに注意してください。

于 2012-12-03T10:35:26.787 に答える
0

コード全体を表示すると、正確なエラーを簡単に取得できますが、提供するコードが少ないため、これを試してみるとよいでしょう。

を使用printf()して表示できますptrdiff_t。1999 C 標準によると、フォーマット文字列には、次のように d または i 変換指定子と共に長さ修飾子 t を含める必要があります。

ptrdiff_t d;
...
printf("%td", d);

%d指定子は C の時代から存在していますが、%t修飾子はかなり新しいものです。まだサポートしている C ライブラリはほとんどありません。コンパイラが をサポートしていない場合は、次の%tdように を試してください%ld

printf("%ld", (long)d);

ptrdiff_t標準 C++ ライブラリを使用して を表示iostreamするのは、他の数値型を表示するのと同じくらい簡単です。

std::cout << d;
于 2012-12-03T09:30:56.483 に答える