• 締切済み

scanf関数について

scanf関数で、下記のように書いたとき char ss[10]; scanf("%s", ss); printf("ss=%s\n", ss); ssは9文字までしかはいりませんが、入力時に10文字以上入力したら、prinitf関数でちゃんと入力した(10文字以上)の文字を表示してくれました。 これは、ssの容量を越えた分のメモリを確保してくれているのですか?

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

処理系が書かれていないので、あくまで参考情報としてですが... 自動記憶域期間を持つオブジェクトをスタック上に割付ける場合、スタック操作を簡便にするために、通常は16~64ビット境界に整列するように配置します。 今回の場合、配列の要素数は10ですが、境界調整の関係上、2バイト以上余分に領域を割付けている可能性が高いと思います。結果として、少しぐらいはみ出しても、何事もなかったかのように振舞います。 もちろん、これは完全にコンパイラの実装に依存しますので、移植性もなければ、(コンパイル結果を管理するのでない限り)何の動作保証もありません。

すると、全ての回答が全文表示されます。
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

いいえ。 たまたまssの直後のメモリが空き領域だったか、壊れても影響が見えないようなところだったか、というだけです。 10文字を大幅に超える文字数を入力すると動作が変になるとおもいますよ。

すると、全ての回答が全文表示されます。
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

そんなことは絶対にありません。たまたま「運がよかった」だけです。 書式に "%as" とすると読み込んだ文字列分の長さを malloc() して返してくれますので、長さを気にする必要がない分助かります。free() するのを忘れないように。処理系依存だったかな? #include <stdio.h> #include <malloc.h> char *ss; scanf( "%as", &ss ); printf( "ss=%s?n" ss ); free( ss );

すると、全ての回答が全文表示されます。
  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

scanfの第2引数はポインタなのでアドレスを渡しているだけです。長さの管理はしません。 ですから取り込む文字の長さなどはプログラマが管理しないとバグの原因となります。 たまたまprintfで表示できただけと思ってください。

すると、全ての回答が全文表示されます。

関連するQ&A