malloc是從系統堆裡面動態申請空間,那與char *申請的空間有什麼區別?

有兩種取地址方式:

一、char *addr = (char *)0xE0000000;

二、char *addr = (char *)malloc(sizeof(char)*12);

以上兩種方式我都可以操作addr後面連續的一段內存地址空間

char msg[12] = "hello world";

for(int i=0;i {

addr[i] = msg[i];

}

那麼請問

1、這兩種方式在操作內存中有什麼區別,只是說第一種申請地址確定,第二種是由操作系統動態的在堆裡面申請的內存然後映射的地址嗎

2、通過第一種方式申請的內存,申請地址後面的連續區域會不會被其他內容覆蓋導致發生錯誤

3、第二種申請方式內存是由操作系統堆函數進行管理的,那麼第一種方式的內存操作系統有辦法進行管理嗎


很好奇:你是從哪裡學來的第一種申請內存的方式的?

事實上,第一種方法根本就不是「申請內存」的方式。

而且,除非你寫的是嵌入式系統中寫驅動,需要直接訪問某埠映射的地址,不然,可以簡單的告訴你這是錯的(你都不需要了解什麼是未定義行為了,這麼操作,沒幾個操作系統是不core的)。

而如果你真的是在開發嵌入式系統的驅動,那我覺得你應該不會來問這個問題。


如果存在操作系統,那第一種方式就是未定義行為。許多操作系統可能直接讓崩。

假設沒有負責全局物理內存管理的操作系統(比如嵌入式),或者是你自己在寫操作系統,那第二種方式一般會炸...


第一種是搶,第二種才是申請。


天啊………………

我來形象地說一下吧……這兩種方式,

②就像你 是導遊要帶一個旅遊團,在酒店預訂了一排房間。房間號當然是酒店來安排,比如準備好後告訴了你預留的房間是312到319,然後你就可以讓大家到時候住進312到319了。

①就像你什麼話也不說直接心裡印定了酒店二樓201到208的房間給旅遊團來住,至於會不會跟酒店工作人員以及二樓已經住下的客人打起來嘛……/微笑


本質上講,二者都是內存的一部分,但是malloc是程序向系統申請的一部分內存,安全可以使用,,你那個第一種,那是指定一塊內存區域,那不叫申請,,,,也就在部分前後台系統里用用,其他地方分分鐘出錯,,,


char addr1[3];

char *addr2 = (char *)malloc(sizeof(char)*3);

是這個意思吧,上面是存在棧區里的,放心用,但只能存放比較少的數據

下面是存在堆區里的,空間比較大,但需要手動釋放


推薦閱讀:

不用虛析構函數也不會造成內存泄漏的原因是什麼?
C/C++靜態庫中的函數在這個靜態庫被使用時還有被inline的可能嗎?
為什麼現在有很多人甚至大學授課還在堅持VC6?

TAG:操作系統 | C編程語言 | 內存管理 | CC |