私は少し混乱しています。私は、scanf()
を使ってCの文字列を読む正しい方法は、
(バッファオーバーフローの可能性は気にしないでください。これは単純な例です)
char string[256];
scanf( "%s" , string );
しかし、以下もうまくいくようです、
scanf( "%s" , &string );
これは私のコンパイラ(gcc)、純粋な運、あるいはそれ以外のものでしょうか。
配列は最初の要素へのポインタに "減衰"するので、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"はこのようなことをした。)