程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中關於內存那些事

C語言中關於內存那些事

編輯:關於C語言

因為要學IOS開發,為了更好的學習OC所以又從頭開始學習C語言,這篇文章主要記錄關於C語言中內存布局、以及不同的內存區域的特點。

C語言的程序內存布局,從高到低依次為:棧區、堆區、未初始化數據區、初始化數據區、代碼區。

一、棧區


由編譯器自動管理,無需程序員手工控制。存放函數的參數值、局部變量的值等。棧區內容從高地址到低地址分配,從低地址到高地址存取。

    int a = 0;
    int b = 0;
    int array[5] = {1, 2, 3, 4, 5};
    
    printf("&a......%p\n", &a);
    printf("&b......%p\n", &b);
    printf("array...%p\n", array);

輸出:

    &a......0x7fff5fbff944
    &b......0x7fff5fbff940
    array...0x7fff5fbff920


從上面的程序運行結果可以看出來,棧中的內容是先定義的變量存放在棧區的上面,後定義的變量放在下面,而空間大小是根據變量的類型決定的。

    printf("&array[0]...%p\n", &array[0]);
    printf("&array[1]...%p\n", &array[1]);
    printf("&array[2]...%p\n", &array[2]);
    printf("&array[3]...%p\n", &array[3]);
    printf("&array[4]...%p\n", &array[4]);

    &array[0]...0x7fff5fbff920
    &array[1]...0x7fff5fbff924
    &array[2]...0x7fff5fbff928
    &array[3]...0x7fff5fbff92c
    &array[4]...0x7fff5fbff930

從上面運行的結果中可以看出,數組中的每一個元素的地址是越來越大的,比如array[0]它是數組中的第一個元素,但是地址卻是最小的那個。


在上面我們還能看到一個現象,就是array數組中的最後一個元素地址與b的地址沒有連接上,除去array[4]本身占用的4個字節空間與b的地址還相差12個字節,這是因為系統在分配內存時,每次會開辟所有變量中占用內存最大的那個元素所占用的內存,然後再從高到低分配,如果本次開辟的內存空間不夠存放下一個變量時,會重新開辟一個最大元素的內存空間。比如說上面的那三個變量,每次會開辟20個字節的空間(int array[5] ==> 5 * 4),a占用了4個,b占用了4個,還剩下12個不能存放array數組,所以就又開辟了一塊20個字節的內存空間。


下圖是目前我們的程序在運行時,各個數據的位置。

\



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved