0

次のようなことを行う C++ コードをいくつか見つけました。

struct Test
{
    int a[128];
    char b[768];
};
 
int main()
{
    Test test;
    for( int i = 0; i < 200; ++i)
        test.a[i] = 1;
    return 0;
}

私はそれが間違っていることに気づきます。しかし、私は効果がどうなるか知りたいですか?GCC 4.3.4 では、Test::b 配列はそのままです。それは保証されていますか?ここで何が起きてるの?

読書も同じ効果?例えば

int main()
{
    Test test;
    for( int i = 0; i < 200; ++i)
        int z = test.a[i];
    return 0;
}
4

5 に答える 5

3

これは未定義の動作であり、が起こる可能性があります。

コンパイラだけでなく、バ​​ージョン、OS、ハードウェア、天気、曜日など、考慮すべき変数がはるかに多くあります。

標準では、未定義の動作は何かを意味する可能性があるため、同じコンパイラであっても、実際には期待できません。

たとえば、 の直後に別の変数がある場合test.a、アクセス違反が発生する可能性があります。または、その変数を単純に上書きすることもできます。何でもあり。

基本的に、この場合未定義なのは書き込み部分ではなく、への呼び出しです。

test.a[i]

i>=128。許可されていないだけです。

于 2012-11-29T20:02:58.600 に答える
1

undefined behaviour配列の境界外に書き込むとどうなるかを予測することはできません。

于 2012-11-29T20:03:03.163 に答える
0

未定義の動作。絶対に保証はなく、文字通り何かが起こる可能性があります。気まぐれな発言としてよくあるのは、おばあさんにヤギをメールで送ることができるというものです。

http://en.wikipedia.org/wiki/Undefined_behavior

実際には、アラインメントのためのパディングのために、 の開始がの終了の直後に続くとは限りませんTestが、オブジェクトへの書き込みはおそらく続行されます。ba

http://en.wikipedia.org/wiki/Data_structure_alignment

于 2012-11-29T20:04:25.493 に答える
0

C++ 標準によって定義された抽象言語である C++ では、あらゆることが起こる可能性があります。

このコンパイラによって定義された具体的な言語である G++ 4.3.4ではtest.b.

于 2012-11-29T20:13:01.073 に答える
0

「未定義の動作」は別として、実際に何が起こるかは、上書きしている部分が実際に使用されているかどうかによって異なります。そのメモリの一部が使用されていない場合、エラーまたはクラッシュが発生する可能性があります (問題を監視するために何かを実行しているかどうかによって異なります)。ただし、そこにデータがあり、クラッシュしない場合、上書きされた部分に依存する別のコードの実行に失敗するというカスケード効果がソフトウェアに発生する可能性があります。これが、これらの問題の追跡を非常に困難にしている理由です。カスケード障害が発生した場合、目に見える症状とは対照的に根本原因を見つけるのが難しいためです (「この変数にそのような値を割り当てたことがないのに、なぜこの変数に値 x があるのですか? ")

于 2012-11-29T21:13:15.720 に答える