3 回答

TA貢獻1825條經驗 獲得超6個贊
不確定的。不能說。您需要提供由返回的確切指針malloc()。
傳遞[和family] free()不返回的指針malloc()是未定義的行為。
根據你的問題,如果malloc()-ed指針存儲在p了,你p++和打電話free(p);,那么就p沒有了指針由歸國的calloc,malloc或realloc功能。
根據7.20.3.2章,c99標準,第二段
free函數使ptr指向的空間被釋放,即可以用于進一步分配。如果ptr是空指針,則不執行任何操作。否則,如果參數與calloc,malloc或realloc函數先前返回的指針不匹配,或者如果通過調用free或realloc釋放了空間,則該行為是不確定的。

TA貢獻1836條經驗 獲得超4個贊
這取決于。您的問題沒有提供足夠的信息。
如果p++導致p引用也由分配的malloc()塊,則該塊將返回到堆(無論分配了什么大?。?。但是,如果它不是指向動態分配的塊的指針,則將破壞堆,結果是不確定的,但永遠不會好!
因此,例如,如果您要這樣做:
struct sBlock* p = malloc( 20 * sizeof(struct sBlock) ) ;
p++ ; // point to second block
free( p ) ; // Heap corruption or runtime error
不需要C運行時來捕獲此類錯誤,但是某些實現或調試環境可能會這樣做。通常,在破壞了堆用來跟蹤內存的結構之后,嘗試分配或釋放更多的內存之前,不會注意到該錯誤。實際的故障模式將是無法預測的,并且通常會在代碼接近度和與實際錯誤的時間上發生一定距離,從而使調試變得困難。
- 3 回答
- 0 關注
- 585 瀏覽
添加回答
舉報