2016-11-17 2 views
-3

このコードは期待通りに動作します:空のベクトル要素へのポインタにアクセスするのは未定義の動作ですか?

std::vector<unsigned char> tab; 
if(!&tab[0])std::cout<<"null"; 

しかし、私はそれは、ベクターが空の場合はnullとして&tab[0]を治療するための法的かどうかわかりません。

&tab[0]は、ベクターが空であるかどうかではなく、nullになると予想されます。

私はconst unsigned char*

+5

もちろんUBです。 –

+3

要素は初期化されていません。それは存在しない。 – LogicStuff

+0

@LogicStuff: 'ベクトルの初期化を解除する ' – Jahid

答えて

3

私はあなたが初期化されない(ベクトル要素)または(初期化されていないベクトル)の要素を意味かどうかわからないんだけど、あなたの例であるが受け入れる関数に渡すことができるようにそれはちょうどですどちらもゼロ要素の初期化されたベクトルです。

a.operator[n]は、セマンティクスが*(a.begin()+n)であると定義されており、空のベクトルではbegin = endで終了イテレータを逆参照しています。この動作は未定義です。

1

コードを記述した方法は、未定義の動作が含まれていますが、初期化されていないメモリにアクセスするため、悪い方法です。

これは、しかし、完全に罰金および法的次のようになります。

std::vector<unsigned char> tab(1); 
if(!&tab[0])std::cout<<"null"; 

tab[0]がそれに割り当てられた値を持っていないにもかかわらず、ポインタがポイントするメモリの有効なセクションがあります。 の値tab[0]であることが保証されていることを思い出すことはできませんが、それはあなたが書いたコードにとって重要ではありません。

+0

nullを出力しません – Jahid

+3

未定義のビヘイビアそれはちょうど "悪い習慣"。 –

+3

* "しかし、これは完全にうまく合法です。" *本当ですが、あまり役に立ちません。 'if'の内容はデッドコードです。 –

関連する問題