私は、なぜC言語で文字列の割り当てがchar array [] = "string"の根底にあるメカニズムは何ですか?
char string[4];
strcpy(string, "aaa");
を経なければならないことを知っているが、どのようにCは
char string[] = "string";
を許可していますか?あなたが何かを誤解しているように見える、事前
私は、なぜC言語で文字列の割り当てがchar array [] = "string"の根底にあるメカニズムは何ですか?
char string[4];
strcpy(string, "aaa");
を経なければならないことを知っているが、どのようにCは
char string[] = "string";
を許可していますか?あなたが何かを誤解しているように見える、事前
で
感謝。 GCCによると、あなたはを行うことが許さです:
char string[4] = "aaa";
違いchar string[] = "aaa";
にコンパイラがそれからstring
の長さは、初期化子だ推測するだけということです。配列リテラルの代わりに文字列リテラルをイニシャライザとして使用できるという事実だけで、他のタイプの配列とは何も変わりありません。ここで
char string[] = "string";
文字列とNUL文字のための十分な余地がありますように、string
の右長さは、コンパイラによって自動的に計算されます。文字列は、実際のstring
容量よりも大きい場合
char string[4];
strcpy(string, "aaa");
ここstrcpy
は、配列の範囲を超えてアクセスすることができます。
strcpyが配列境界を超えてアクセスできる場合は、サイズに応じて配列のメモリアドレスが割り当てられます文字列の? – hemel
いいえ、次のメモリアドレスに書き込みを続けるだけで、他の変数が占有し、未定義の結果が得られます。このテクニックはバッファーオーバーフロー攻撃に使用されるので、ユーザーが指定した文字列からstrcpyを実行している場合は、最初に宛先バッファーのサイズが十分大きいことを確認する必要があります。 – AwkMan
@hemel:いいえ、配列のサイズは変更しません(あなたが言うこと):それは_your_ジョブです。それは配列の境界を越えて書き込むだけで、UBにつながります。 – edmz
Cはネイティブの文字列型を一度も持っていません。 '\ 0'で終わる文字列は文字列とみなされます。 – sjsam
http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c –
@ P.P。これはまったく同じではありません。これは 'char string [4]'と 'char string []'の違いです。もう一方は 'char string []'と 'char * string'の間です。 – skyking