2016-07-21 6 views
-3

私はC++の私の最初のプロジェクトに取り組んでいるJavaプログラマです。配列の扱い方を理解するのは苦労しています。私は次のコードと構造的に同等なプログラムを作成しようとしています。しかし、私の実際のプロジェクトでは、class Astruct Bがヘッダファイルで宣言されています。私がこれを理解する方法は、b.arr[2]というステートメントが配列b.arrの長さをインスタンス化するということです。しかし、次のコードをそのまま実行すると、エラーexited with non-zero statusが発生します。 b.arr [1]をa2に設定する行をコメントアウトすると、うまく動作します。なぜこれが、私はこれをどうすればよいのでしょうか?また、b.arr配列を別の長さに再定義できる方法はありますか?私は周りを見回しましたが、私は見つけることができないこの特定の問題に対処するようです。C++オブジェクトの配列の要素を定義する

class A {}; 

struct B { 
    A *arr[]; 
}; 

int main() { 
    B b; 
    b.arr[2]; // instantiates array to be of length 2? 
    A a1; 
    A a2; 
    b.arr[0] = &a1; 
    b.arr[1] = &a2; // RUNS FINE WITHOUT THIS LINE 
} 

ありがとう!

私はarduinoライブラリのためにこれを書いています。だから、私はstd名前空間を使うことができません。

+3

[book](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を読んで、ランダムなものを試してください。あなたが注意しなければあなたの窓を通ってvelociraptorをジャンプするかもしれないC++で未定義の動作と呼ばれるこのことがあります。 – user463035818

+0

'b.arr [2]'は未定義の動作です。割り当てられていない配列の要素3にアクセスします。 –

+0

実行時にサイズを設定または変更できる動的配列を作成する場合は、['std :: vector'](http://en.cppreference.com/w/cpp/container/vector )。コンパイル時にサイズが固定された配列が必要な場合は、['std :: array'](http://en.cppreference.com/w/cpp/container/array)をお勧めします。 –

答えて

1
b.arr[2]; // instantiates array to be of length 2? 

これは配列の3番目の要素を参照し、要素の値は何もしません。

有効なメモリを指すように初期化されていない場合、b.arrの要素にアクセスしているため、プログラムは未定義の動作を呼び出します。

+0

なぜその行はコメントアウトされていますか? –

+1

@ user3451141、未定義の動作を理解しようとするのは無意味です。 –

+0

@ user3451141未定義の動作について読んでください。それはうまくいくかのように見えますが、velociraptorはすでに角を曲がっているところに潜んでいます:P – user463035818

0
b.arr[2]; 

これは既に定義されていません。まだ割り当てられていないものにアクセスする。これは、すべてのベットがオフであることを意味し、特定の方法で動作するコードに依存することはできません。

ポインタを保存する場合は、静的長さのコンテナにstd::vector<A*>またはstd::array<A*>のようなものを試してみてください。正しくない

+0

私はarduinoのためにこれを書いているので、std名前空間を使うことはできません。私はこれを最初に言及するのを忘れましたが、私は編集を行いました。しかし、ありがとう! –

関連する問題