在LeetCode做題時遇到一個運行時錯誤,將引起問題的原因記錄一下備忘:
我們在malloc或calloc等API分配內存時,libc庫除了分配給我們在參數中設定大小的內存(可能會有內存對齊,實際分配的比參數設定的要多),還會在這塊所分配的內存之前預留出一塊內存,記錄所分配內存的位置、大小等元數據
。不妨設這段預留的內存大小為16字節,若我們獲得的系統分配的內存塊的起始地址為0x80300000, 設定的長度是0x200。那么地址0x802FFFF0位置放的就是控制信息,如下圖所示:
??
程序中出現的問題是無意中訪問并改寫了預留的16字節的元數據
。這樣一來,在釋放這塊內存時就會出現問題,導致程序運行時崩潰。