2011-11-12 29 views
2

私は512頂点の配列をとるこの関数を持っています。 (それぞれx、y、z座標を含む)。とにかく、私は間違いを犯し、アレイにアクセスする代わりに512回、私は513回それをやった。 「ゼロ」の代わりに、私は数字を得た。私は同じことをやり直す。私は反復と同じことを再び増やしました。私が配列の限界を超えていても、関数のたびにランダムな値が表示されていました。これらの値は何ですか? OSで何かにアクセスしていますか? (それは馬鹿だが、C++とポインタに新しいかもしれません)奇妙な配列の振る舞い

void print_facet_array(FACET3 *f) 
{ 
    int i=0; 
    for (i=0;i<=513;i++) 
    { 
     printf("The vertices (x,y,z) for facet %d are: V_1 = x:%f , y:%f, z:%f. \n", i, f[i].p1.x, f[i].p1.y, f[i].p1.z); 
     printf("The vertices (x,y,z) for facet %d are: V_2 = x:%f , y:%f, z:%f. \n", i, f[i].p2.x, f[i].p2.y, f[i].p2.z); 
     printf("The vertices (x,y,z) for facet %d are: V_3 = x:%f , y:%f, z:%f. \n", i, f[i].p3.x, f[i].p3.y, f[i].p3.z); 
    } 

} 

答えて

4

実際には、ループは514回進みます。したがって、2でオーバーランしています。

C/C++での配列のオーバーランは完全に未定義の動作です。何かが起こる可能性があります(クラッシュ、悪いデータ)。

あなたのケースでは、おそらくスタックまたはヒープガベージを読み取っている可能性があります。これは何でもかまいません。

0

CおよびC++では配列の境界チェックがサポートされていません。 Javaと異なり、法的な範囲外の配列にアクセスすると例外が表示されるため、C++はアクセスを許可します。要するに、おめでとう。ダイス(乱数ジェネレータ)を作成しました。

最後に到達した後に表示されている値は、最後の要素の後にメモリ内にあったものです。これは古い変数、別の変数、または初期化されていないメモリブロックからのゴミだけかもしれません。

+3

。 – Pubby

4

境界を超えて配列にアクセスすると、結果はUndefined Behaviorとなります。
未定義の動作とは、何かが起こり、安全なベットがすべてオフになっていることを意味します。

これらの値は実際には何でもかまいません。あなたの配列に予約されていないメモリ位置に値が存在します。他の有効な変数に属している可能性があります。

境界要素を超えて配列要素にアクセスするには、NEVERを覚えておいてください。

あなたがC++を学ぶために始めているので、これは良い読み込みする必要があります:あなたは、** **乱数生成器としてこれを使用しないでくださいどのような
What every c programmer should know about Undefined Behavior.