C語言中關於記憶體那些事

2021-06-22 12:13:55 字數 1415 閱讀 7601

c語言的程式記憶體布局,從高到低依次為:棧區、堆區、未初始化資料區、初始化資料區、**區。

一、棧區

由編譯器自動管理,無需程式設計師手工控制。存放函式的引數值、區域性變數的值等。

棧區內容從高位址到低位址分配,從低位址到高位址訪問。

int a = 0;

int b = 0;

int array[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個位元組的記憶體空間。

下圖是目前我們的程式在執行時,各個資料的位置。

c 記憶體對齊那些事

一.記憶體對齊介紹 目前的計算機系統中 cpu都是按照位元組進行讀取儲存的記憶體資料,訪問某乙個變數的時候 需要在特定的位址空間中訪問,此時就需要各種不同型別的變數在記憶體空間中按照一定的規則進行排放,而不是乙個接乙個的進行有序排放。所以現代編譯器中都會對記憶體進行自動的對齊。struct stru...

記憶體那些事

linux中的free m可以檢視當前的記憶體使用情況 yejianfeng iz23fsd free m total used free shared buffers cached mem 7869 7737 132 0 489 4419 buffers cache 2828 5040 swap ...

C語言中關於記憶體的分配

在編寫c語言程式時,我們的記憶體儲存在4塊區域,分別為棧 stack 堆 heap 資料區 data和.bss區域 常量區 唯讀 棧 棧區域中存放的是區域性變數,函式定義的形參,和auto修飾的自動變數。特點 1 棧空間是os 作業系統 自動分配和 程式設計師不用去管 2 棧空間可以被反覆使用 3 ...