アプリ版:「スタンプのみでお礼する」機能のリリースについて

scanf関数で、下記のように書いたとき

char ss[10];
scanf("%s", ss);
printf("ss=%s\n", ss);

ssは9文字までしかはいりませんが、入力時に10文字以上入力したら、prinitf関数でちゃんと入力した(10文字以上)の文字を表示してくれました。
これは、ssの容量を越えた分のメモリを確保してくれているのですか?

A 回答 (4件)

scanfの第2引数はポインタなのでアドレスを渡しているだけです。

長さの管理はしません。
ですから取り込む文字の長さなどはプログラマが管理しないとバグの原因となります。
たまたまprintfで表示できただけと思ってください。
    • good
    • 0

そんなことは絶対にありません。

たまたま「運がよかった」だけです。

書式に "%as" とすると読み込んだ文字列分の長さを malloc() して返してくれますので、長さを気にする必要がない分助かります。free() するのを忘れないように。処理系依存だったかな?

#include <stdio.h>
#include <malloc.h>

char *ss;
scanf( "%as", &ss );
printf( "ss=%s?n" ss );
free( ss );
    • good
    • 0

いいえ。


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

処理系が書かれていないので、あくまで参考情報としてですが...



自動記憶域期間を持つオブジェクトをスタック上に割付ける場合、スタック操作を簡便にするために、通常は16~64ビット境界に整列するように配置します。

今回の場合、配列の要素数は10ですが、境界調整の関係上、2バイト以上余分に領域を割付けている可能性が高いと思います。結果として、少しぐらいはみ出しても、何事もなかったかのように振舞います。

もちろん、これは完全にコンパイラの実装に依存しますので、移植性もなければ、(コンパイル結果を管理するのでない限り)何の動作保証もありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!