「p」の値:
これに合うように十分なスペースを割り当てました: ""
[[文字列はnullで終了します、覚えていますか?表示されませんが、そこにあります。つまり、1バイトが使い果たされています。]]
しかし、あなたはこれを保存しようとしています: "01234556789abcdefghijklmnopqrstuvwxyz"
したがって、結果として、「123 ..」で始まる「もの」は、割り当てたメモリを超えて格納されます。おそらく、他の「もの」を他の場所に上書きします。そのため、結果は乱雑になり、「jidupont」が言ったように、クラッシュするだけではないのは幸運です。
印刷出力[壊れた]「p」
言ったように、あなたは「p」の終わりを過ぎて書いた。しかし、mallocはこれを知りません。したがって、「q」のメモリの別のブロックを要求すると、「p」のメモリに続くメモリが得られた可能性があります。そして多分それはメモリ(典型的)を整列させたので、そのポインタはいくつかの良い数に切り上げられます。そして多分それはあなたが気にしないはずの簿記情報を保存するためにこの記憶のいくらかを使うでしょう。でも分かりませんね あなたも知っているはずではありません-あなたは自分で割り当てていないメモリに書き込むべきではありません!
そしてその結果は?あなたはあなたが期待したもののいくつかを見ます-しかしそれは切り捨てられます!なぜなら...別のブロックがおそらくあなたが使用したメモリに割り当てられた(そして許可なく使用された、私は追加するかもしれない)、または他の何かがそのブロックを所有してそれを変更し、そしていずれにせよいくつかの値が変更された-結果: "01234556789abcdefghijklm !"。繰り返しになりますが、物事が爆発しただけではなかったのは幸運でした。
「q」を解放する
「q」を解放してから、それにアクセスしようとすると(印刷しようとしているように)、(通常は)厄介なエラーが発生します。これは当然のことです。その「free(q)」のコメントを外してはいけません。しかし、まだ何も入れていないので、「q」を印刷しようとしないでください。ご存知のとおり、ジブリッシュが含まれている可能性があるため、印刷はNULLに遭遇するまで続行されます。これは、世界の終わりまで発生しない可能性があります。または、プログラムが必要以上のメモリにアクセスするまで、印刷は続行されます。 t、OSがあなたに満足していないためにクラッシュします。:)