1. C語言 malloc()函數 分配內存空間尺寸的問題
#include
<stdio.h>
#include
<stdlib.h>
int
main()
{
int
*x
=
0;//定義個指針變數,開始不指向任務地方
x
=
(int
*)malloc(sizeof(int));//用malloc申請內存,並讓指針x指向申請的內存空間
*x
=
100;//給申請的內存空間賦值
printf("%d\n%x\n",*x,x);//列印出申請的空間的值,後面為x指向的內存地址
free(x);//釋放內存,也就到這里
return
0;
}
2. C語言-動態分配內存 malloc & free
需要用一個數組來保存用戶的輸入,但是卻不知道用戶會輸入多少條數據。
(1) 如果設一個太大的數組,則顯得浪費內存
(2) 如果設得太小,又怕不夠
問題:如何做到恰好夠用、又一點不浪費呢?
系統中存在一個內存管理器(MM, Memory Manager),它負責管理一堆閑置內存。它被設計用於解決此類問題。
MM提供的服務:應用程序可以向MM申請(借出)一塊指定大小的內存,用完之後再釋放(還回)。
應用程序在使用malloc時,要把返回值轉換成目標類型。
這塊內存和數組沒有本質區別,用法完全相同。
需要先計算需要多少位元組的內存空間
數組舉例子:
釋放的時候需要注意, 因為在for循環執行之後,p的地址往前移動了10, 所以需要減去10, 然後再釋放p,不然會有問題
// 當銷毀時只需要free一次,malloc了幾個位元組就會free幾個位元組,和char類型還是int類型無關
free(p);
在一個函數中動態分配的內存,在另一個函數中操作這塊內存
(1) MM是一個系統級的東西,所有的應用程序都向同一個MM申請內存。
(2) 何為借出?實際上,在內存被借出時,MM只是把它管理的內存標記了一下,表示該段內存已經被佔用。比如,它把每一段被佔用的內存給記錄下來(首地址,長度)
(p0,n0) (p1, n1) (p2, n2) ...
(3) MM非常慷慨:①只要有人 malloc ,它都同意借出 ②你不歸還,它永遠不會主動要求你 free 。
(4) MM管理的內存區域稱為「堆」Heap
這意味著,用戶程序應該自覺得及時 free ,以便不耽誤別的應用程序的使用。如果有個應用程序不停地 malloc ,而不 free ,那最終會用光MM的內存。當MM沒有更多閑置內存時, malloc 返回 NULL ,表示內存已經用完。
再次重申: 應用程序在malloc之後,應該盡早free !
使用原則:需要的時候再申請,不需要的時候立即釋放
實際上,MM對借出的內存塊進行標識
(p0, n0) (p1, n1) (p2, n2) ...
它內部已經保證任意兩塊內存不會「交疊」,即不會重疊,不會把一塊內存同時借給兩個應用程序使用。
所以,每塊內存的首地址都是不同的,在 free 的時候只需要指明首地址即可。
對象指的一塊內存
示例:用Citizen表示一個市民,用Car表示一個輛車。他起初沒有車,但未來可能有一輛車。
怎麼樣才算「及時」? 「不及時」會怎樣?
MM里可用的內存是有限的,你用完了就得盡快還,因為別的應用程序也需要MM的內存。
只借不還,積累到一定程度,MM沒有更多內存可用,於是malloc返回NULL。
要還就得全還,否則MM那邊處理不了
原因是:MM可能此時沒有閑置內存可用。(雖然這種情況一般不會發生)
free之後,該內存交還給MM,該內存不再可用(失效)
不一定要在相同的函數里釋放,在應用程序的任意一個角落釋放都是有效的。
也就是說:這一塊內存被malloc出來之後,完全交給你處置
功能:將 s 中當前位置後面的 n 個位元組 (typedef unsigned int size_t )用 ch 替換並返回 s
參數:
參數:
功能:由 src 所指內存區域復制 n 個位元組到 dest 所指內存區域。
memmove() 功能用法和 memcpy()) 一樣,區別在於: dest
和 src 所指的內存空間重疊時, memmove() 仍然能處理,不過執行效率比 memcpy() 低一些