[解決済み] 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言語実装ではこのようなことが行われていました)。
関連
-
関数 'malloc' の暗黙の宣言に対する解決策
-
[解決済み] Xcode - 警告。C99 では関数の暗黙の宣言は無効です。
-
[解決済み] C関数から文字列を返す
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] printf()は"%f "でいいのに、なぜscanf()は倍数のために"%lf "が必要なのですか?
-
[解決済み] なぜコンパイラは予測可能な加算ループを乗算に最適化できないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
initializer element is not constant "というエラーが表示されるのですが?
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] Xcode - 警告。C99 では関数の暗黙の宣言は無効です。
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] C言語でランダムなint型を生成するには?