scanf による文字列バッファへの読み込みが、アンパサンド (&) の有無にかかわらず機能するのはなぜですか? 質問する

scanf による文字列バッファへの読み込みが、アンパサンド (&) の有無にかかわらず機能するのはなぜですか? 質問する

ちょっと混乱しています。C弦scanf()の正しい読み方は、

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

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

ただし、次の方法も有効であるようです。

scanf( "%s" , &string );

これは私のコンパイラ (gcc) だけの問題でしょうか、それとも単なる幸運でしょうか、それとも何か他の原因でしょうか?

ベストアンサー1

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

次にscanf、引数リストの末尾を処理するときに、 を取り出そうとしますchar *。 または を渡した場合はこれで正しいのですstring&string[0]、 を渡した場合は、&string言語標準で保証されていないもの、つまり、ポインタ&stringと (&string[0]同じ場所から始まる異なるタイプとサイズのオブジェクトへのポインタ) が同じ方法で表現されることに依存しています。

私は、それが機能しないシステムに遭遇したことはないと思いますし、実際にはおそらく安全です。とはいえ、それは間違いであり、一部のプラットフォームでは失敗する可能性があります。(仮想的な例:すべてのポインタに型情報を含む「デバッグ」実装。考えるSymbolics の「Lisp マシン」の C 実装では、次のような処理が行われました。

おすすめ記事