web-dev-qa-db-ja.com

scanfで文字列を読む

私は少し混乱しています。私は、scanf()を使ってCの文字列を読む正しい方法は、

(バッファオーバーフローの可能性は気にしないでください。これは単純な例です)

char string[256];
scanf( "%s" , string );

しかし、以下もうまくいくようです、

scanf( "%s" , &string );

これは私のコンパイラ(gcc)、純粋な運、あるいはそれ以外のものでしょうか。

129
abeln

配列は最初の要素へのポインタに "減衰"するので、scanf("%s", string)scanf("%s", &string[0])と同等です。一方、scanf("%s", &string)は-char[256]へのポインタを渡しますが、同じ場所を指しています。

それからscanfは、引数リストの末尾を処理するとき、char *を引き出そうとします。これはstringまたは&string[0]を渡したときの正しいことですが、&stringを渡したときは、言語標準では保証されていないこと、つまりポインタ&stringおよび&string[0] - のオブジェクトへのポインタに依存します。同じ場所から始まるさまざまな種類やサイズは、同じように表されます。

私はこれまでうまくいかないシステムに出会ったとは思わないし、実際にはあなたはおそらく安全だと思う。それでも、それは間違っています。いくつかのプラットフォームでは失敗する可能性があります。 (仮定の例:すべてのポインタに型情報を含む「デバッグ」実装。IthinkシンボリックスのC実装 "LISP Machines"はこのようなことをした。)

125