c語言陣列在記憶體中是怎麼分配的,c語言中二維陣列在記憶體中是按什麼優先存放的?

時間 2021-08-16 03:09:23

1樓:

c語言中記憶體為分三類:棧區、堆區、靜態資料區。

區域性變數在棧上分配,函式呼叫前的棧指標,要和函式返回後的棧指標一樣,否則就會出錯。

void test(void)

char i,a[10];

printf("0x%x", &i);

printf("0x%x", a);

printf("0x%x", a+1);

printf("0x%x", a+2);

printf("0x%x", a+3);

擴充套件資料c語言陣列在記憶體分配

示例:#include

int main()

int a[4] = ;

int b[4] = ;

int *pa = &a;

int i = 0;

while(i<8)

i++;

printf("now *p value = %d and",*pa);

printf("p addr value = %d \n",pa);

pa++;

return 0;

2樓:飛鷹

c語言使用的記憶體是虛擬記憶體。按照功能的不同在c語言中又將虛擬記憶體為分三類:棧區、堆區、靜態資料區,不管是單一變數還是陣列,其記憶體分配都是這樣分的。

虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體(一個連續完整的地址空間),而實際上,它通常是被分隔成多個實體記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。目前,大多數作業系統都使用了虛擬記憶體,如windows家族的「虛擬記憶體」;linux的「交換空間」等。

3樓:

關於多個變數一起定義的時候分配記憶體,是和具體的編譯環境有關的。這裡舉vc++6.0和tc2.0為例,這段源**是以.c副檔名儲存的。#include

int main()

char i,a[10];

return 0;

執行結果如圖。左側為tc2.0編譯出來的,右側為vc++6.

0編譯出來的。可以看出在棧區陣列下標是向高地址方向增長的,這一點沒有疑問。但是i和陣列a的前後關係卻有差異。

在tc2.0中i位於低地址端而在vc++6.0中i卻位於高地址端。

樓主如果有其他的編譯環境也可以試試看。

4樓:匿名使用者

int a[10];

首先每個int佔4個位元組,所有要為區域性變數a申請40個位元組的棧空間,要申請棧空間,就是把sp(棧指標)的值減去40,然後a就是指向(sp-40)的指標,a[0]的地址就是(sp-40),a[1]的地址就是(sp-36),a[2]的地址就是(sp-32),以此類推。當然這些地址的計算工作都是編譯器在背後幫我們算好了,並存放在exe或dll檔案裡了。char i,a也是一樣的原理。

如果這樣還是不明白的話,你可以在除錯進斷點的時候,右鍵源**,選中「go to disassembly」進入彙編除錯頁。你可以看到,每個函式開始的時候都是有這幾行:

push ebp //儲存源指標的值,這裡不用管它

mov ebp,esp //把棧指標的值賦值給ebp,在這個函式裡面,都是通過這個ebp減去某個數值來操作區域性變數的。

sub esp, d0h //這個函式要裡總共要用到的棧空間,就是這句話申請的它的意思是"esp=esp-d0h".

int a[10];a[1]=1;

的彙編**就是

mov dword ptr [ebp-28h],1

ebp就是原來的棧指標的值。

5樓:吉祥二進位制

使用c語言程式設計,實際上使用的記憶體只有一種——虛擬記憶體。根據功能的不同在c語言中又將虛擬記憶體為分三類:棧區、堆區、靜態資料區,無論單一變數還是陣列,其記憶體分配都是如此。

其中,棧區、靜態資料區、堆區都會有編譯器負責分配、作業系統負責管理,程式設計師可以在堆區使用malloc()來動態分配堆記憶體。

1、棧區:一般每一個函式對應一個棧區,在編譯原理中稱為棧幀。比如下面的**:

int main()

; return 0;

}2、靜態資料區:這實際上對應於生成的可執行檔案的.data區段,因為這個區段在生成的可執行檔案中,因此是「靜態的」。比如下面的**:

//定義一個20個int元素的全域性陣列,此時陣列分配的虛擬記憶體稱為靜態資料區,有編譯器自行分配。

int g_a[20];

int main()

3、堆區:堆區是最複雜的,有作業系統負責堆管理,但是當用c語言編譯器生成一個可執行檔案並且執行時,它會預設建立一些堆。拿windows來說,每一程式執行,它會建立至少兩個堆,一個是預設堆,一個是new堆。

比如下面的**:

int main()

6樓:匿名使用者

首先i和a是沒有關聯的 在棧區的空閒地址中隨機分配,a內部中,a元素是低地址,由於是char型的陣列,每個元素佔一個位元組,所以從a。。。。a依次地址加1

7樓:永遠在路上的人

c中分堆,棧,和常量區,堆是我們自己申請釋放的,棧由系統替我們管理,區域性變數和形參放在棧裡,棧根據增長方式的不同,有的系統是從低到高的,有的是從高到低的,有一個堆疊指標指向棧頂,根據filo原則進行控制!用完了就銷燬!

8樓:匿名使用者

如果靜態記憶體分配:a[0] a[1]。。。。a[9],地址由低到高,一般系統每個int元素佔4byte

如果棧區:地址由高到低 b a[9] a[8]...a[1] a[0]

9樓:匿名使用者

int a[10];

a[0] a[1] a[2] ..... a[9]地址依次從低到高

因為是int型陣列所以他們均相距sizeof(int) 個位元組

10樓:

區域性變數才在棧上分配,函式呼叫前的棧指標,要和函式返回後的棧指標一樣,否則就是出錯了。

怎麼分配你可以自己打寫個小測試程式。

void test(void)

還有可能有對齊的問題,可能你會看到分配的地址不連續。

void test(void)

如果你看到的地址不連續,比如說4位元組對齊的話,i佔了一個位元組,還剩下3個位元組,而j要4個位元組,上面剩下的3個位元組不能容下j,剩下的3個位元組就會不被利用,這時j和i的地址就不連續,會差3個位元組。如果沒有地址對齊的話應該是連續在棧上分配的。

11樓:

你下斷點除錯一下就知道了

棧是倒著排列的,所以i在最後,

順序是a[0]   0x22ff20

a[1]   0x22ff21

a[2]

a[3]

a[9]

ia[0]在棧頂

具體見下圖,可以看到記憶體地址

12樓:匿名使用者

連續分配的,a[1]和a[2]就在相鄰隔壁

c語言中二維陣列在記憶體中是按什麼優先存放的?

13樓:二蛋的哥哥哥

c語言中

二維陣列是按行優先儲存的

即 在記憶體中存一個二維陣列時 先把陣列中第一行的陣列元素存完 再接著存下一行的 直到存完。

ps:定義一個二維陣列 如 int a[m][n] 該陣列為m行 n列的矩陣,在記憶體中 這樣順序存的:

a[0][0] a[0][1] ... a[0][n-1] a[1][0] a[1][1]...

不知道是不是幫到你的忙瞭望採納

14樓:匿名使用者

比如a[2][3];的存放順序是:

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

15樓:米呀你

c語言陣列是行優先的

c怎麼讓陣列動態的分配記憶體來儲存

首先對於你的問題明確一下 第一 你是說自己寫一個動態分配的資料麼?如果是那樣的話,你使用c中malloc和realloc,然後使用free釋放,方法一樓已經說過,不多說了 你也可以使用c 中的new和delete,new和malloc基本差不多,但是new和delete是c 中的,對用類使用的話,n...

C語言中常量在記憶體中的儲存形式怎麼表示

濯友瑤肇螺 1 整數是以補碼的形式轉換為二進位制 儲存在計算機中。實數是以ieee754標準轉換為二進位制 儲存在計算機中。字元本質實際也與整數的儲存方式相同 先通過ascii碼把字元轉換為對應的整數,再按整數以補碼形式轉換為二進位制 2 char型常量 字元 在計算機中是按其ascii值進行儲存,...

c語言陣列中括號的問題,C語言陣列中括號的問題

函式形參中int sorce其實相當於int sorce,所以是指標而不是陣列,不信你可以在函式內改變形參sorce的值,而陣列是不可以重新賦值的。c 是不接受陣列作形參的。 可以在定義陣列的時候直接賦值,那樣就可以省略了列如 int a 陣列定義時必須確定長度,系統才知道給它分配多少記憶體。陣列作...