>>623
mallocで領域確保するしないの問題と

>char *str;
>scanf("%s",str);ではできませんが
>char str[100];
>scanf("%s",str);はできて

これは分けて考えないと。

mallocっていうのはアプリケーションとOSとの間のやり取りで見ると
その都度要求のあったメモリサイズをちまちまOSから借りてくるわけではなく
何らかのタイミング(アプリケーション起動時、もしくはアプリケーションが最初に発行するmalloc)
である程度の大きさのメモリを借りてきます。

たまたまあなたの作ったアプリケーションが借りてきたメモリが実は1バイト以上なので
malloc(1)で確保したエリアに3文字書いてもエラーにならかった分けです。
この辺はヒープという単語でググってください。

で、
>char *str;
>scanf("%s",str);ではできませんが
こっちはstrポインタだけで文字を収める先が用意されてないので駄目です。

>char str[100];
>scanf("%s",str);はできて
こちらはstrは100個の文字を収める場所がありますので当然OKです。