1. ホーム
  2. c

[解決済み] scanfを使った文字列バッファへの読み込みが、アンパサンド(&)ありでもなしでも動作するのはなぜですか?

2022-04-25 15:41:04

質問

少し混乱していることがあります。私は、C言語の文字列を読み取る正しい方法は scanf() のような流れになりました。

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

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] -- 同じ場所から始まる異なる型やサイズのオブジェクトへのポインタは、同じように表現されます。

私はこれまで、それが機能しないシステムに出会ったことはないと思っていますし、実際にはおそらく安全でしょう。とはいえ、これは間違いであり、プラットフォームによっては失敗する可能性があります。(仮定の例として、すべてのポインタに型情報を含むデバッグの実装があります。I 思う Symbolics "Lisp Machines"のC言語実装ではこのようなことが行われていました)。