2015 11 03 內存分區

  1、//內存區域的劃分(從低到高)
    //1.棧區
    //2.堆區++++++++++++++重點+++++++++++
    //3.靜態區(全局區)
   
 //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 + 4) = 50;
//    //重新分配的空間會把之前空間的內容給拷貝過來,放到相對的位置,所以需要遍歷
//    for (int i = 0; i < 5; i ++) {
//        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,相等;不同的時候返回差值;比較過程是逐個字節比較,返回第一對對應字節位置不同數據的差值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章