2016-07-28 10 views
0

私は、なぜC言語で文字列の割り当てがchar array [] = "string"の根底にあるメカニズムは何ですか?

char string[4]; 
strcpy(string, "aaa"); 

を経なければならないことを知っているが、どのようにCは

char string[] = "string"; 

を許可していますか?あなたが何かを誤解しているように見える、事前

+1

Cはネイティブの文字列型を一度も持っていません。 '\ 0'で終わる文字列は文字列とみなされます。 – sjsam

+4

http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c –

+1

@ P.P。これはまったく同じではありません。これは 'char string [4]'と 'char string []'の違いです。もう一方は 'char string []'と 'char * string'の間です。 – skyking

答えて

2

感謝。 GCCによると、あなたはを行うことが許さです:

char string[4] = "aaa"; 

違いchar string[] = "aaa";にコンパイラがそれからstringの長さは、初期化子だ推測するだけということです。配列リテラルの代わりに文字列リテラルをイニシャライザとして使用できるという事実だけで、他のタイプの配列とは何も変わりありません。ここで

+0

文字配列に文字列を割り当てましたchar string [] = "aaa"しかし私は後で内容を変更してください。エラーはありません。 – hemel

+0

@FabioTurati私は最後の段落についてのあなたのコメントが存在しなくなった段落にのみ適用されるように段落を削除しました... – skyking

2
char string[] = "string"; 

文字列とNUL文字のための十分な余地がありますように、string長さは、コンパイラによって自動的に計算されます。文字列は、実際のstring容量よりも大きい場合

char string[4]; 
strcpy(string, "aaa"); 

ここstrcpyは、配列の範囲を超えてアクセスすることができます。

+0

strcpyが配列境界を超えてアクセスできる場合は、サイズに応じて配列のメモリアドレスが割り当てられます文字列の? – hemel

+1

いいえ、次のメモリアドレスに書き込みを続けるだけで、他の変数が占有し、未定義の結果が得られます。このテクニックはバッファーオーバーフロー攻撃に使用されるので、ユーザーが指定した文字列からstrcpyを実行している場合は、最初に宛先バッファーのサイズが十分大きいことを確認する必要があります。 – AwkMan

+0

@hemel:いいえ、配列のサイズは変更しません(あなたが言うこと):それは_your_ジョブです。それは配列の境界を越えて書き込むだけで、UBにつながります。 – edmz

関連する問題