malloc,我誤解你了

2021-09-09 04:32:07 字數 735 閱讀 3640

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

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

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

對使用者而言,所有記憶體都是虛擬的,也就是說程式並不是直接執行在物理記憶體上,而是執行在虛擬記憶體上,然後由虛擬記憶體轉換到物理記憶體。在對虛擬記憶體位址到物理記憶體位址進行轉換時,核心會對位址的正確性進行檢查,如果位址是合法的,核心就會提供對應的物理記憶體分頁;如果是申請記憶體空間,核心就會檢查空餘的物理記憶體分頁,並加以分配,如果物理記憶體空間不足,核心會拒絕此次申請。使用malloc分配的記憶體空間在虛擬位址空間上是連續的,但是轉換到物理記憶體空間上有可能是不連續的,因為有可能相鄰的兩個位元組是在不同的物理分頁上。

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

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

malloc,我誤解你了

malloc用於動態申請記憶體,這個學過c語言的都知道。忘記了在哪本書上看到,malloc申請的記憶體不一定是連續,於是一直記住了。這句話有錯嗎?沒有!但是當時只是記住了這個知識點,而沒有深入的思考。直到今天,思考乙個問題 char a char malloc 10 a 1 與a 1 相等嗎?如果m...

我想死你了

在窗體上鏤空文字 我想死你了 private declare function beginpath lib gdi32 byval hdc as long as long private declare function endpath lib gdi32 byval hdc as long as ...

是我冤枉了你

買了電腦放假回來當然是要上網的了,為了顯示我是專業人士,我用了當時最快的網速2m的adsl當然是電信的了開始了我的網路生涯 當然是家裡的了 和學校的 網咖 裡果然是天淵之別,畢竟是2m的。又過來乙個學期又到假期聽說138圓的公升成3m的了,我又乙個哥們比我還早裝的他當時是1m,從1到2,然後到3,大...