2017-07-06 7 views
1

Iは、このコードを有する目的[0]()

char a[0]; 
cout << "What is a? " << a << endl; 
char *word = itoa(123,a,10); 
string yr = string(word); 

私はトラブル配列[0]を理解しています。私はその価値を変えようとしたが、変化があるかどうかを見極めようとしたが、全く違いはないようだ。

たとえば、変更は[0] [1]、または任意の他の整数に、出力はまだ何の違い

char a[1]; 
cout << "What is a? " << a << endl; 
char *word = itoa(123,a,10); 
string yr = string(word); 

その目的はここ何ですかをしない場合でも?

+5

は 'char a [0]'(コードのように)か 'char a [1]'(タイトルのように)ですか? 「その価値を変えようとした」とはどういう意味ですか?あなたは[mcve]を提供できますか? – user463035818

+0

ああ申し訳ありませんが[0]、値を変更することによって、私は[0]から[1]への整数を意味するなど –

答えて

3

itoa function is non-standard以降、これは一般的な署名itoa(int, char*, int)の説明です。

第2パラメータは、値を表すヌル終了文字列がコピーされるバッファを表します。それは文字列全体に十分なスペースを提供する必要があります:あなたの場合は、"123"です。これは4文字です。あなたのコードはa[]をバッファに渡しますが、a[]のサイズは"123"文字列全体を収容するには不十分です。したがって、呼び出しはundefined behaviorを引き起こします。

aを宛先文字列に合わせて十分に大きくする必要があります。 32ビットシステムでitoa(すなわち-2147483648)によって生成できる最長10進数に対応するには、サイズ12のバッファを渡すだけで十分です。宣言でchar a[0]char a[12]に置き換えてください。

1

ここでの目的は何ですか?

長さゼロの配列は、要素を持たない配列です。

内容が表示されないため、内容を印刷または変更することはできません。

There are arcane reasons to want to use oneですが、一般的にはあなたの目的はありません。標準では許可されていません(ただし、コンパイラはあくまでそのような理由でサポートしています)。

変化[0] [1]、または任意の他の整数に、出力はまだ差

井戸を作るていない場合でも、内N要素を持つ配列を有する場合そしてあなたはn以上の量のデータを書きます。これは "バッファオーバーラン"であり、未定義の動作です。誰かの記憶を上書きしたり、プログラムがクラッシュしたり、あなたの犬が突然ゾンビになって生きてしまうようになったりすることがあります。最高のtbhを避けた。

+0

私はゼロ長さの配列変数は、おそらく言語拡張としてサポートされています)。 – user2079303

+0

@ user2079303:ハム、それも知らなかったけど、あなたは正しい。 –