2017-07-14 7 views
-1

std::arrayの不思議な振る舞いに私はつまずいた。 std::vectorなどの一部のコンテナでは、すべてのセルが初期化され、intのベクトルはデフォルトで0で満ちるベクトルになります。これがstd::arrayでも当てはまるかどうかを調べました。私は2つの事を発見しました:デフォルトの値を持つstd :: arrayの初期化

1)ほとんどのセルが初期化されているようですが(おそらくこれには別の理由があります)、そうでないものもあります。

2)初期化されていないセルは、常に同じです。これは、プログラムの別々の実行と別々のコンパイルとの間でも当てはまります。以下の出力を考えてみましょう。このコードの場合:

なぜこれらの2つのものがこのようになっているのだろうか。この見かけ上の初期化(おそらく何か他のもの)の原因と、初期化されていないセルは常に同じものです(そして、前の実行時と同じ値を持つことがあります)。

$ cocompile test.cpp 
$ ./a.out 
1583671832 1235456 1235456 1235456 1235456 1235456 0 0 0 0 
$ ./a.out 
1539111448 1235456 1235456 1235456 1235456 1235456 0 0 0 0 
$ ./a.out 
1509472792 1235456 1235456 1235456 1235456 1235456 0 0 0 0 
$ cocompile test.cpp 
$ ./a.out 
1551280664 32767 1551280664 32767 55136256 1 0 1 71644448 1 71644352 1 0 0 0 0 0 0 0 0 
$ ./a.out 
1413601816 32767 1413601816 32767 192815104 1 0 1 407872800 1 407872704 1 0 0 0 0 0 0 0 0 
$ ./a.out 
1542519320 32767 1542519320 32767 63897600 1 0 1 129918240 1 129918144 1 0 0 0 0 0 0 0 0 
$ cocompile test.cpp 
$ ./a.out 
1510054424 32767 1 0 1510054368 32767 145269321 1 1510054400 32767 1510054400 32767 1510054424 32767 96362496 1 0 1 145265952 1 145265856 1 0 0 0 0 0 0 0 0 
$ ./a.out 
1394678296 32767 1 0 1394678240 32767 378704457 1 1394678272 32767 1394678272 32767 1394678296 32767 211738624 1 0 1 378701088 1 378700992 1 0 0 0 0 0 0 0 0 
$ ./a.out 
1436727832 32767 1 0 1436727776 32767 353342025 1 1436727808 32767 1436727808 32767 1436727832 32767 169689088 1 0 1 353338656 1 353338560 1 0 0 0 0 0 0 0 0 
+0

の可能性のある重複(https://stackoverflow.com/questions/18295302/default-initialization-of- stdarray) – speedious

+0

いいえ、それは私の質問ではありません。 –

答えて

0

std::arrayinitializes the array following the rules of aggregate initialization (note that default initialization may result in indeterminate values for non-class T)のコンストラクタです。

intのでstd::array

constructorを確認してくださいあなたのa配列の要素non-class値がindeterminateですされ、その後、彼らはあなたのaの要素に割り当てられた場所に居住しているだけでゴミの事もできます。だからこそ、時々異なる結果を見るのです。

つまり、un-initialized variablesにアクセスしているため、これはundefined behaviorです。

0

未定義の動作のようです。あなたがstd::arrayを初期化するデフォルトにしたい場合は、代わりに次の操作を行います[?のstd ::配列のデフォルトの初期化]

std::array<int, 100> a = {}; 
+0

しかし、パターンは未定義のためにかなり規則的です。質問に対する答えはハードウェアとドライバにあると思いますか? –

+2

@lotolmencre未定義の動作には、パターンがあるように見えることが含まれます。初期化されていないメモリの内容について推論しようとするのはあまり意味がありません。 – Blastfurnace

関連する問題