因為要學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個字節的內存空間。
下圖是目前我們的程序在運行時,各個數據的位置。