malloc函數與relloc函數

來源:互聯網
上載者:User

  以前都在C++中new一個記憶體空間,在C中,就得用另一函數malloc申請自己指定大小的記憶體空間,如果想動態申請記憶體空間可以使用relloc函數。

      void *mallco(int size);

  malloc 向系統申請分配指定size個位元組的記憶體空間。傳回型別是 void* 類型。void* 表示未確定類型的指標,可以強制轉換為任何其它類型的指標。

  需要注意的是,

  1、malloc 函數返回的是 void * 類型,定義的哪種類型的指標,必須強轉為此類型指標,比如 p = (int *) malloc (sizeof(int)*2);因為不能將 void* 賦值給 int * 類型變數,所以必須通過 (int *) 來將強制轉換。

  2、函數的實參為 sizeof(int) ,用於指明一個整型資料需要的大小。如果你寫成:int* p = (int *) malloc (1);代碼也能通過編譯,但事實上只分配了1個位元組大小的記憶體空間,當你往裡頭存入一個整數,就會有3個位元組無家可歸,而直接“住進鄰居家”,在free的時候也會出現堆棧衝突的錯誤。

  3、malloc是必須指定記憶體大小的空間,比如想分配50個int類型的空間:int* p = (int *) malloc ( sizeof(int) * 50 ); //分配可以放得下50個整數的記憶體空間。

  malloc 也可以達到 new [] 的效果,但是malloc 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。

      void *realloc(void *mem_address, unsigned int newsize);

     先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體地區,而後釋放原來mem_address所指記憶體地區,同時返回新分配的記憶體地區的首地址。即重新分配儲存空間塊的地址。他的作用就是重新申請記憶體空間,不影響原有資料,但是新分配的地址可能不一樣了。

     需要注意的:

    1、如果mem_address為null,則realloc()和malloc()類似。分配一個newsize的記憶體塊,返回一個指向該記憶體塊的指標。如果沒有足夠可用的記憶體用來完成重新分配(擴大原來的記憶體塊或者分配新的記憶體塊),則返回null而原來的記憶體塊保持不變。 

    2、如果有足夠空間用於擴大mem_address指向的記憶體塊,則分配額外記憶體,並返回mem_address這裡說的是“擴大”,realloc是從堆上分配記憶體的,當擴大一塊記憶體空間時, realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平。也就是說,如果原先的記憶體大小後面還有足夠的 空閑空間用來分配,加上原來的空間大小= newsize。得到的是一塊連續的記憶體。

    3、如果原來記憶體大小沒有足夠的空間來分配,那麼就會從堆棧中另找一塊指定大小的記憶體,並把原來的記憶體空間的內容複寫歸來,返回心的mem_address指標,以前的被放回堆棧。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.