1、//內存區域的劃分(從低到高)
//1.棧區
//2.堆區++++++++++++++重點+++++++++++
//3.靜態區(全局區)
//4.常量區
//4.常量區
//5.代碼區
2、static int number
= 10;//被static 修飾的全局變量生命週期隨着程序的創建而創建,隨着程序的消失而消失;
3、//局部變量:定義在函數內部的變量就叫做局部變量,局部變量都是存儲在棧區
3、//內存管理的時候系統也是遵循內存對齊原則,因爲這樣可以提高內存的分配效率
4、//靜態區(全局區)
//有static 修飾的變量存放在靜態區,靜態區的變量有一個特點,整個程序運行中,只被初始化一次;如果人爲未初始化,系統默認初始化爲0
5、//系統提供的函數由於使用比較頻繁,我們把它存放在棧區,原因是棧區的內容會被反覆的創建銷燬,不需要我們去管理內存還是因爲棧區的內存開闢和釋放的內存
6、//代碼區:程序中運行的函數或者變量等等語句都會編譯成CPU指令,存放在代碼區;
7、 malloc calloc realloc memset (要做釋放free(p);操作並賦值p
=Null)
memcpy memcmp (不用做釋放操作)
// free(p);//釋放掉p
指向的堆區空間,只是標記刪除,不清空裏面的內容
// free(p); 過度釋放,釋放多次,過度釋放會造成crash 崩潰
p = NULL; //指向的是無效的空間,防止野指針錯誤
(1)malloc:申請內存的函數
// void *malloc( size_t)
// void * ,泛類型,void * 返回的指針可以賦值給任何類型的指針,int * ,float* ,char *,short*
// size_t 代表申請多少個字節的大小的內存空間
// malloc 的作用,申請的 size 個字節大小的空間,並把申請的空間首地址返回
(2) //calloc(size_t, size_t)
//兩個參數的意思;表示申請n個size大小的空間,返回時申請空間的首地址,但是它在申請空間的時候會多一步處理,清除麼一個字節裏的內容,也就是清零操作,正是因爲calloc 多了一
步 清零操作,執行效率要比malloc低;
//realloc(p, n) //內存的重新分配,第一個參數是地址,第二個參數是重新分配的內存大小
(4)//使用relloc 重新分配空間的時候,若再原有分配空間的基礎上可以連續載增加 n (原有空間大小 )個空間大小,指針指向不會改變;若這時不可以連續增加(n - 原有空間大小),會將之前的空間給釋放掉,然後再去堆區的其他位置開闢連續的n個空間大小的內存,指針的指向發生改變了;
注意:重新分配的空間需要接收
// int *p6 = malloc(12);
// *p6 = 10;
// *(p6 + 1) = 20;
// *(p6 + 2) = 30;
// printf("之前的地址:%p\n",p6);
// p6 = realloc(p6, 20);//重新分配空間的大小
// printf("之前的地址:%p\n",p6);
// *(p6 + 3) = 40;
// *p6 = 10;
// *(p6 + 1) = 20;
// *(p6 + 2) = 30;
// printf("之前的地址:%p\n",p6);
// p6 = realloc(p6, 20);//重新分配空間的大小
// printf("之前的地址:%p\n",p6);
// *(p6 + 3) = 40;
// *( p6 + 4) = 50;
// //重新分配的空間會把之前空間的內容給拷貝過來,放到相對的位置,所以需要遍歷
// for (int i = 0; i < 5; i ++) {
// printf("%d ",*(p6 + i));
// }
// free(p6);
// printf("%d ",*(p6 + i));
// }
// free(p6);
// p6 = NULL;
(3)memset(開始地址, n, size);
給定一個開始地址,將size字節的空間大小內的數據置爲n,若n爲0,size爲10,就是把10個字節中的數據置爲0;
(4) memcpy(dest, source, n); //從源source指針開始的位置,向目的指針拷貝n個字節的數據;注意:前面的空間要足夠大;
(5)memcmp(p1, p2, n); 比較p1
和 p2 指向的內存裏的內容是否相同,比較n 個字節,返回值是0,相等;不同的時候返回差值;比較過程是逐個字節比較,返回第一對對應字節位置不同數據的差值