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

c言語の勉強しているのですが、気になることがあります.。。。

#include<stdio.h>

int main(void)


do{
char moji[10];
scanf(“%s”,&moji);
printf(“%s”,moji);
}while(1);

return 0;}

charの宣言で10ビットまでしか入力できないはずなのに、なぜかAを10個以上入力してもエラーが出ません。
しかしこのdo while文を削除した上でAを10個以上入力するとエラーが表示されます。

なぜこのようなことが起きるのかご教授願えないでしょうか

A 回答 (3件)

>charの宣言で10ビットまでしか入力できないはず


scanf()では、入力桁数のチェックは行われません。
従って10文字以上の入力もできてしまいます。
その場合、変数宣言により確保したメモリ領域外に上書きされ、
後に続く変数の内容を変える事が有ります。
変数以外の領域に上書きされた時の動作は不定(何が起きるか
解らない)となります。
    • good
    • 1
この回答へのお礼

偉そうですみません...
なぜdo whileにすると続けてエラーと出ずに入力し続けられるのでしょうおうか?
あとこのバグの名称はメモリリークというのですか?

お礼日時:2017/12/02 14:06

誤;10ビット


正:10文字(又は10バイト)
    • good
    • 0
この回答へのお礼

バイトを間違えていました。
ありがとうございます。

お礼日時:2017/12/02 14:07

>なぜdo whileにすると続けてエラーと出ずに入力し続けられるのでしょうおうか?



ぶっ壊したメモリの影響がループ中では影響しなかっただけ…です。
破壊した場所がmain()からの戻った時に実行されるアドレスが格納されていたとすると、
そのdo whileループは無限ループの為、main()から戻りませんので影響が『見えません』。


>あとこのバグの名称はメモリリークというのですか?

バッファオーバーランという、お手本のような不具合です。
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83 …
    • good
    • 0
この回答へのお礼

なんとなく理解できました。。。
ありがとうございます☆*:.。. o(≧▽≦)o .。.:*☆

お礼日時:2017/12/02 14:36

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