2016-08-28 20 views
0

私はポインタを理解しようとします。質問は:私はループの2番目のコンパイル時にセグメント違反を取得するべきではありませんか?ない場合はなぜですか?私はy [0] [dim]の外にある要素へのアクセスを防ぐことができませんでした。無限の配列要素へのアクセス?

int main(){                         
     int dim = 3;                       
     int ordnung = 2;                      
     double** y = new double*[ordnung];                  

     for(int i = 0; i<ordnung; i++){                  
       y[i] = new double[dim];                  
     }                          

     for(int i = 0; i<=100; i++){                   
       cout << y[0][i] << endl;                  
     }                          

     delete[] y;                       
     return 0;                        
} 

出力も私を混乱さ:

0 
0 
0 
1.63042e-332 
0 
0 
0 
6.520933e-319 

と継続的なゼロを。どういう意味ですか?

+0

関連項目:http://stackoverflow.com/questions/12553154/initial-value-of-dynamically-allocated-memory-in-c –

答えて

1

new[]を使用してメモリを割り当てると、特定の方法でメモリが初期化されません。その内容は不定であり、それにアクセスすると、読んでもの未定義の動作につながります。

また、の未定義の動作であるが割り当てられたメモリの境界から外れます。 C++には、組み込みの境界チェックがありません。

そして、割り当てたメモリをすべて解放しないでください。それぞれnewの場合、一致する数字はdelete、一致する数字はnew[]、一致する数字はdelete[]です。


最後に、いくつかの注意事項:まず第一に、あなたは今まであなたが動的配列が必要だと思う場合は、あなたの次の思考がstd::vectorでなければなりません。

とメモリに関する

newまたは new[]を使用した場合、初期化されていないもちろん、それはあなたが割り当て何 に依存しています。コンストラクタでオブジェクト(またはオブジェクトの配列)を割り当てると、コンストラクタが呼び出されます。コンストラクタはではなく、で、オブジェクトを初期化することができます。

+0

私はこれらの初期化されていない要素を扱う場合、私はいつもさらなるコードで未定義の振る舞いに走りますので、それらを使うのは意味がありませんか?だから私は明示的にユーザーがそれらにアクセスするのを防ぐ必要がありますか? –

関連する問題