天天看點

2015.08.24記憶體分區

  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,相等;不同的時候傳回內插補點;比較過程是逐個位元組比較,傳回第一對對應位元組位置不同資料的內插補點

轉自:http://blog.csdn.net/qq_31810357