經典的Linux進程內存布局,如下圖:
整個內存空間包括棧區,全局區,堆區。
void arr_on_stack() {
int arr[6];
arr[0]=100;
arr[1]=200;
arr[2]=300;
arr[3]=400;
arr[4]=500;
arr[5]=600;
int a = arr[0];
}
我們定義了一個局部變量arr作為int類型的數組,然后分別將100-600寫到了數組中。那么,數組arr在內存中是怎樣表示的呢?
首先,我們編譯一下:
#gcc-g-fno-stack-protectora.c
注意,-fno-stack-protector選項是為了禁止堆棧保護,讓匯編更容易懂些。使用gdb測試代碼運行情況,gdb面前程序的運行時(run time)了無秘密。用gdb來調試剛剛編譯出來的程序,這里看一下arr_on_stack函數的匯編指令:
(gdb) disassemble arr_on_stack
Dump of assembler code for function arr_on_stack:
0x0000000000400526 <+0>: push %rbp
0x0000000000400527 <+1>: mov %rsp,%rbp
0x000000000040052a <+4>: movl $0x64,-0x20(%rbp)
0x0000000000400531 <+11>: movl $0xc8,-0x1c(%rbp)
0x0000000000400538 <+18>: movl $0x12c,-0x18(%rbp)
0x000000000040053f <+25>: movl $0x190,-0x14(%rbp)
0x0000000000400546 <+32>: movl $0x1f4,-0x10(%rbp)
0x000000000040054d <+39>: movl $0x258,-0xc(%rbp)
=> 0x0000000000400554 <+46>: mov -0x20(%rbp),%eax
0x0000000000400557 <+49>: mov %eax,-0x4(%rbp)
0x000000000040055a <+52>: nop
0x000000000040055b <+53>: pop %rbp
0x000000000040055c <+54>: retq
End of assembler dump.
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Linux
+關注
關注
87文章
11295瀏覽量
209348 -
內存
+關注
關注
8文章
3020瀏覽量
74008 -
C語言
+關注
關注
180文章
7604瀏覽量
136710
發布評論請先 登錄
相關推薦
C語言中什么是指針數組
在C語言中一個數組,若其元素均為指針類型數據,稱為指針數組,也就是說,指針數組中的每一個元素都存放一個地址,相當于一個指針變量。
C語言怎么建立內存的動態分配
在C語言中,全局變量是分配在內存中的靜態存儲區的,非靜態的局部變量,包括形參是分配在內存中的動態存儲區的,這個存儲區是一個“棧”的區域。
C語言如何創建數組
C語言是一種非常強大和靈活的編程語言,它提供了若干數據類型來存儲和操作數據。其中之一就是數組,它可以用來存儲一系列具有相同數據類型的元素。本文將詳細介紹如何在
c語言中數組怎么定義
C語言中,數組是一種用來存儲相同類型元素的數據結構。它可以存儲多個元素,并通過一個共同的名稱來引用這些元素。數組是一種很重要的數據結構,可以用于解決很多實際的問題。 在
c語言中多維數組可以嵌套定義
C語言中多維數組可以嵌套定義,這使得我們可以在一個數組中存儲另一個數組。通過這種方式,我們可以創建更加復雜和靈活的數據結構,以便更好地表示和
數組和鏈表在內存中的區別 數組和鏈表的優缺點
數組和鏈表在內存中的區別 數組和鏈表的優缺點? 數組和鏈表是常見的數據結構,用于組織和存儲數據。它們在內存中的存儲方式以及優缺點方面
評論