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 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...