亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果在C中更改指針,將釋放多少內存?

如果在C中更改指針,將釋放多少內存?

C
白衣非少年 2019-10-22 22:42:53
假設有20個內存塊,并且指針p指向第一個塊。現在,當我這樣做時:p++;free(p);多少個內存塊將被釋放,為什么?
查看完整描述

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釋放了空間,則該行為是不確定的。


查看完整回答
反對 回復 2019-10-22
?
HUH函數

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運行時來捕獲此類錯誤,但是某些實現或調試環境可能會這樣做。通常,在破壞了堆用來跟蹤內存的結構之后,嘗試分配或釋放更多的內存之前,不會注意到該錯誤。實際的故障模式將是無法預測的,并且通常會在代碼接近度和與實際錯誤的時間上發生一定距離,從而使調試變得困難。


查看完整回答
反對 回復 2019-10-22
  • 3 回答
  • 0 關注
  • 585 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號