1. 程式人生 > >malloc,我誤解你了

malloc,我誤解你了

沒有 size 程序員 等了 兩個 span 內存空間 空間不足 問題:

malloc用於動態申請內存,這個學過C語言的都知道。忘記了在哪本書上看到,malloc申請的內存不一定是連續,於是一直記住了。這句話有錯嗎?沒有!但是當時只是記住了這個知識點,而沒有深入的思考。直到今天,思考一個問題:

char *a=(char *)malloc(10);

*(a+1)與a[1]相等嗎?如果malloc分配的內存不連續,這兩個就可能不相等了,可是我們在使用的時候,卻一直默認它們是相等的,並且也沒有出現問題啊。那是不是malloc分配的內存一定是連續的了呢?

對用戶而言,所有內存都是虛擬的,也就是說程序並不是直接運行在物理內存上,而是運行在虛擬內存上,然後由虛擬內存轉換到物理內存。在對虛擬內存地址到物理內存地址進行轉換時,內核會對地址的正確性進行檢查,如果地址是合法的,內核就會提供對應的物理內存分頁;如果是申請內存空間,內核就會檢查空余的物理內存分頁,並加以分配,如果物理內存空間不足,內核會拒絕此次申請。使用malloc分配的內存空間在虛擬地址空間上是連續的,但是轉換到物理內存空間上有可能是不連續的,因為有可能相鄰的兩個字節是在不同的物理分頁上

所以,對於應用層程序員來說,是連續的,程序員看到的是虛擬地址空間。如果到物理層,地址就不一定連續了,我們平時在開發程序的時候,都是在虛擬地址空間操作,故,此時我們malloc分配的內存是連續,所以*(a+1)與a[1]在我們使用的時候總是相等的。

誤會你那麽久,其實也是因為自己當初只是簡單的記憶你分配的內存不一定是連續的,就沒有再去深究了,如此看來,在學習上刨根問底也是有必要的,知識的深度決定你的高度。

malloc,我誤解你了