OK beberapa jawaban tentang malloc sudah diposting.
Bagian yang lebih menarik adalah cara kerja gratis (dan ke arah ini, malloc juga dapat dipahami dengan lebih baik).
Dalam banyak implementasi malloc / gratis, bebas biasanya tidak mengembalikan memori ke sistem operasi (atau setidaknya hanya dalam kasus yang jarang terjadi). Alasannya adalah bahwa Anda akan mendapatkan celah di tumpukan Anda dan dengan demikian itu bisa terjadi, bahwa Anda baru saja menghabiskan 2 atau 4 GB memori virtual Anda dengan kesenjangan. Ini harus dihindari, karena begitu memori virtual selesai, Anda akan berada dalam masalah besar. Alasan lainnya adalah, bahwa OS hanya dapat menangani potongan memori yang berukuran dan sejajar. Untuk lebih spesifik: Biasanya OS hanya dapat menangani blok yang dapat ditangani oleh manajer memori virtual (paling sering kelipatan 512 byte misalnya 4KB).
Jadi mengembalikan 40 Bytes ke OS tidak akan berfungsi. Jadi apa yang dilakukan gratis?
Gratis akan menempatkan blok memori dalam daftar blokir sendiri. Biasanya ia juga mencoba untuk menyatukan blok yang berdekatan di ruang alamat. Daftar blokir gratis hanyalah daftar bundar memori yang memiliki beberapa data administratif pada awalnya. Ini juga alasan mengapa mengelola elemen memori yang sangat kecil dengan standar malloc / gratis tidak efisien. Setiap potongan memori membutuhkan data tambahan dan dengan ukuran yang lebih kecil terjadi fragmentasi lebih banyak.
Daftar bebas juga merupakan tempat pertama yang dilihat malloc ketika sepotong memori baru diperlukan. Itu dipindai sebelum memanggil memori baru dari OS. Ketika potongan ditemukan yang lebih besar dari memori yang dibutuhkan, itu dibagi menjadi dua bagian. Satu dikembalikan ke penelepon, yang lain dimasukkan kembali ke daftar gratis.
Ada banyak optimasi berbeda untuk perilaku standar ini (misalnya untuk potongan memori kecil). Tetapi karena malloc dan bebas harus sangat universal, perilaku standar selalu menjadi kelemahan ketika alternatif tidak dapat digunakan. Ada juga optimisasi dalam menangani daftar-bebas - misalnya menyimpan potongan-potongan dalam daftar yang diurutkan berdasarkan ukuran. Tetapi semua optimasi juga memiliki keterbatasan mereka sendiri.
Mengapa kode Anda rusak:
Alasannya adalah bahwa dengan menulis 9 chars (jangan lupa trailing byte nol) ke dalam area berukuran untuk 4 chars, Anda mungkin akan menimpa data administrasi yang disimpan untuk sepotong memori lain yang berada "di belakang" potongan data Anda ( karena data ini paling sering disimpan "di depan" potongan memori). Ketika bebas kemudian mencoba untuk memasukkan potongan Anda ke dalam daftar gratis, ia dapat menyentuh data administrasi ini dan karena itu tersandung pada penunjuk yang ditimpa. Ini akan merusak sistem.
Ini adalah perilaku yang agak anggun. Saya juga telah melihat situasi di mana pointer pelarian di suatu tempat memiliki data yang ditimpa dalam daftar bebas memori dan sistem tidak segera crash tetapi beberapa subrutin kemudian. Bahkan dalam sistem dengan kompleksitas sedang masalah seperti itu bisa sangat, sangat sulit untuk di-debug! Dalam satu kasus saya terlibat, kami butuh (sekelompok besar pengembang) beberapa hari untuk menemukan alasan crash - karena berada di lokasi yang sama sekali berbeda dari yang ditunjukkan oleh dump memori. Itu seperti bom waktu. Anda tahu, "bebas" atau "malloc" Anda berikutnya akan macet, tetapi Anda tidak tahu mengapa!
Itulah beberapa masalah C / C ++ terburuk, dan salah satu alasan mengapa pointer bisa sangat bermasalah.