day11動態記憶體分配

2021-07-09 03:09:58 字數 2908 閱讀 6804

1.記憶體區域的劃分(從高到低)

a.棧區    棧 (先進後出)      佇列(先進先出)

b.堆區(重點)

c.靜態區(全域性區)只初始化一次;如果初始化沒給值,系統預設為零;只有程式退出才釋放

d.常量區    常量占用記憶體,唯讀狀態,絕不可修改

e.**區

2. 棧區      乙個程式在記憶體中棧區大概分配7~8m的棧區記憶體,遞迴能很快的吃掉記憶體

3.區域性變數存在於棧區,有系統為其分配空間和釋放空間,開發人員不需要關係棧區的管理

4.常量區  (』a』,10,「iphone」,3.14),都存在於常量區,常量區的內容是不允許修改的,常量區的資料也是有系統分配的,不需要開發人員管理

5.靜態區    (全域性區)有static 修飾的變數存放在靜態區,靜態區的變數有乙個特點整個程式執行過程中,只被初始化一次,如果沒有初始化,系統會預設為0

6.**區     程式中執行的函式 或者變數等一些其他的語句都會編譯成cpu指令放在**區;系統提供的函式由於使用比較頻繁,我們把它存放在棧區,原因棧區的內容會被反覆的建立銷毀,不需要我們去管理記憶體,還有是因為棧區的記憶體開闢和釋放都是非常迅速的

7. 堆區    是唯一一塊開發者能夠控制的記憶體區域,這塊區域記憶體我們要手動申請,並且手動釋放

malloc 代表申請記憶體的函式

void *malloc

(size_t)

void *,泛型別,返回的指標可以賦值給任何型別的指標,eg:int*,float*,char*,short*

size_t代表申請多少個位元組大小的記憶體空間

malloc的作用:申請size個位元組大小的空間,並把申請空間的首位址返回

char *p = malloc(8);//p

記憶體儲存的是

8個空間的首位址

//*p = "iphone";

陣列不能直接賦值

strcpy(p, "iphone");//

往堆區空間儲存字串

printf("%s\n",p);

8.free(p)

p  =null   指向的無效空間,防止野指標錯誤

釋放掉p指向的對去空間,只是標記刪除,不清空裡面的內容;過度釋放,釋放多次,過度釋放會造成崩潰

9.其他的記憶體分配函式

calloc(n,4)表示:兩個引數的意思,申請n個size大小的空間,返回時申請空間的首位址,但是它在申請空間的時候會多做乙個處理,清除每乙個位元組裡的記憶體,也就是清零操作,正式因為calloc多了一步輕靈的操作,執行效率要比malloc低

10.relloc(p,n)記憶體的重新分配函式,第乙個引數是位址,第二個引數重新分配的記憶體大小;使用relloc重新分配空間的時候,如果在原有空間的基礎上可以連續在增加(n -原來空間大小)的空間,指標的指向不會改變,如果這時不可以連續增加(n-原來空間的大小),會將之前的空間給釋放掉,然後,再去堆區的其他位置開闢連續的n個空間大小的記憶體,指標的指向發生改變了

int *p = malloc(12);

*p = 10;

*(p+1) = 20;

*(p+2) = 30;

printf("

之前的位址

%p\n",p);

p = realloc(p, 20);//

重新申請空間的大小

printf("

之後的位址

%p\n",p);

*(p+3) = 40;

*(p+4) = 50;

//重新分配的空間會把之前的空間裡的內容給拷貝過來,放到相應的位置

for (int i =0; i < 5; i++)

free(p);

p = null;

11.memset(開始位址,n,size);給定乙個開始位址,將size的空間大小的資料視為n,如果n為零,size為10,就是把10個位元組中的資料視為0;

int*p7  =

malloc(12

);memset

(p7,1,

4);printf

("%d\n"

,*p7);

char *p7 = malloc(4);

memset(p7, 97, 2);

printf("%c\n",*p7);

printf("%c\n",*(p7+1));

11.memcpy(dest,source,n)從原指標開始向目的指標拷貝n個位元組的資料

char

str1 =

"abc"

;char

str2 =

"123"

;memcpy

(str1, str2,2);

printf

("%s\n"

,str1);

12.memcmp(p1,p2,n);比較p1和p2指向記憶體裡的記憶體是否相同,比較n個位元組,返回值是0,相等,不同的時候,返回差值;比較的過程是追個位元組比較,返回第一對對應位元組的位置不相同資料的差值

乙個位元組表示範圍(

-256~255

)這是有符號的

無符號的位元組範圍(

0~255

int*p8 =

malloc(4

); *p8 =

260;

int*p9 =

malloc(4

);*p9  =

772;

intresult =

memcmp

(p8, p9,2);

printf

("%d\n"

,result);

free

(p8);

p8 =

null

;free

(p9);

p9=null;

13.被static修飾的全域性變數,生命週期隨著程式的建立而建立,隨著程式的消失而消失

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...

動態記憶體分配

c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...