在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言中數組在內存中如何表示

jf_78858299 ? 來源:碼農的荒島求生 ? 作者:陸小風 ? 2023-02-15 14:35 ? 次閱讀

C語言中數組在內存中是怎樣表示的,今天就給大家聊聊這個話題。

開局一張圖:

圖片

這個是經典的Linux進程內存布局,通常我們使用的數據存在這樣幾個地方:

  • 棧區,Stack
  • 全局區,Global
  • 堆區,Heap

接下來我們分別看一下C語言中的數組在這幾個區域是怎樣表示的,注意,小風哥的機器是x86 64位。

數組與棧區

來看一段極其簡單的代碼:

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-protector a.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.

我們在之前的文章《函數在內存中是怎樣表示的?》多次提到過,每個函數在運行起來后都有屬于自己的棧幀,棧幀組成棧區,此時arr_on_stack這個函數的棧區在哪里呢?答案就在寄存器rbp中。

我們來看一下rbp寄存器指向了哪里?

(gdb) p $rbp
$3 = (void *) 0x7ffffffee2a0

啊哈,原來棧幀在0x7ffffffee2a0這個地方,那么我們的數組arr在哪里呢?別著急,這條指令會告訴我們答案:

0x000000000040052a <+4>:     movl   $0x64,-0x20(%rbp)

這行指令的含義是說把100(0x64)放到rbp寄存器減去0x20的地方,顯然這就是數組的開頭,讓我們來計算一下rbp寄存器減去0x20:

0x7ffffffee2a0(%rbp) - 0x20 =  0x7ffffffee280

因此,我們預測arr應該在0x7ffffffee280這個位置上。

接下來我們用gdb驗證一下:

(gdb) p &arr
$2 = (int (*)[6]) 0x7ffffffee280

哈哈,怎么樣,是不是和我們猜想的一樣,數組arr的確就放在了0x7ffffffee280這個位置,是這樣存儲的:圖片

這就是C語言中所謂的數組了, 無非就是從0x7ffffffee280 到 0x7ffffffee298這一段內存嘛 ,數組在棧區就是這么表示的!

數組與全局區

同樣看一段代碼:

int global_array[6];

void arr_on_global() {
    global_array[0]=1;
    global_array[1]=2;
    global_array[2]=3;
    global_array[3]=4;
    global_array[4]=5;
    global_array[5]=6;

    int b = global_array[0];
}

同樣使用# gcc -g -fno-stack-protector a.c編譯,然后用gdb加斷點在int b = global_array[0]這行代碼,看下全局變量global_array的內存位置:

(gdb) p &global_array
$12 = (int (*)[6]) 0x601050 

gdb告訴我們數組global_array存放在內存0x601050這個地址上。

注意0x601050這個地址和剛才看到的0x7ffffffee280這個地址相去甚遠,為什么呢?

再看下開局那張圖:圖片

全局區幾乎在最底部,棧區在最頂部,所以相差很遠。

接下來讓我們看看0x601050這個內存區域中到底保存了些啥?

我們使用命令x/6wd 0x601050,這個命令告訴gdb從0x601050這個位置開始以32bit為單位用10進制依次打印6次,讓我們來看看打印的是什么?

(gdb) x/6wd 0x601050
0x601050 <global_array>:        1      2      3      4
0x601060 :     5      6

哈哈,怎么樣,是不是正是全局變量global_array中存放的內容:圖片

這就是C語言中所謂的數組了, 無非就是從 0x601050到 0x601068這一段內存嘛 ,數組在全局區就是這么表示的!

數組與堆區

來段代碼:

void array_on_heap() {
    int* arr = (int*)malloc(sizeof(int) * 6);
    arr[0] = 100;
    arr[1] = 200;
    arr[2] = 300;
    arr[3] = 400;
    arr[4] = 500;
    arr[5] = 600;

    int a = arr[0];
}

使用gdb加斷點在int a = arr[0];這行代碼,然后打印數組arr的地址:

(gdb) p arr
$20 = (int *) 0x602010

注意0x602010這個地址,這個地址和剛才的全局數組global_array的地址0x601050比較接近,因為堆區和全局區挨得比較近,可以再回過頭看一下開局那張圖。

然后我們同樣使用x命令查看這個區域的內存內容:

(gdb)  x/6wd 0x602010
0x602010:       100     200     300     400
0x602020:       500     600

依然不出我們所料,這個區域保存的正是數組的值。

圖片

這就是C語言中所謂的數組了, 無非就是從 0x602010到 0x602028這一段內存嘛 ,數組在堆區就是這么表示的!

現在你應該明白了吧,C語言中所謂的數組是怎么表示的?很簡單,其實也沒啥表示, 無非就是內存中一段連續的空間 ,僅此而已。

希望這篇文章對大家理解C語言中的數組有所幫助。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3099

    瀏覽量

    74847
  • C語言
    +關注

    關注

    180

    文章

    7624

    瀏覽量

    139511
  • 數組
    +關注

    關注

    1

    文章

    419

    瀏覽量

    26269
收藏 人收藏

    評論

    相關推薦

    淺談C語言中數組在內存的存在形式

    我們定義了一個局部變量arr作為int類型的數組,然后分別將100-600寫到了數組。那么,數組arr在內存
    的頭像 發表于 09-28 14:50 ?2356次閱讀
    淺談<b class='flag-5'>C</b><b class='flag-5'>語言中</b><b class='flag-5'>數組</b><b class='flag-5'>在內存</b>的存在形式

    小數在內存是如何存儲的?為什么C語言中的浮點數不支持位移操作?

    小數在內存是如何存儲的?為什么C語言中的浮點數不支持位移操作?
    發表于 08-16 09:24 ?1207次閱讀
    小數<b class='flag-5'>在內存</b><b class='flag-5'>中</b>是如何存儲的?為什么<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的浮點數不支持位移操作?

    C語言中數組和結構體的內存表示和布局

    C語言中數組和結構體都可以代表一塊內存,但為什么結構體可以直接賦值,而數組不可以?這個問題涉及到C
    發表于 08-28 10:54 ?1929次閱讀

    C語言中數組的用法

    C語言數組是一種數據結構,它可以存儲多個相同類型的數據,例如整數,字符,浮點數等。數組的每個元素都有一個索引,用來表示它在
    的頭像 發表于 11-24 17:48 ?1530次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b><b class='flag-5'>數組</b>的用法

    如何使用單片機的C語言中數組

    如何使用單片機的C語言中數組
    發表于 10-15 08:59

    單片機C語言中常用的基本數據類型分為哪幾類

    不管在什么語言中,定義一個變量時必然要在內存開辟一個相應大小的空間來存儲該變量。不同的數據類型在內存所占的空間大小不同,其所能表示的數據范
    發表于 02-28 06:46

    C語言中的char數組和char指針有什么區別?

    讓我們通過下面的例子,來了解 C語言中字符數組和字符指針之間的區別。
    的頭像 發表于 01-29 16:35 ?3022次閱讀

    C語言中數組空間動態開辟

    C語言中數組空間動態開辟 在C語言中,必不可少的需要使用到數組,通常為了動態的開辟
    的頭像 發表于 02-10 12:42 ?2344次閱讀

    C語言中什么是指針數組

    C語言中一個數組,若其元素均為指針類型數據,稱為指針數組,也就是說,指針數組的每一個元素都存
    的頭像 發表于 03-10 15:26 ?2070次閱讀

    C語言怎么建立內存的動態分配

    C語言中,全局變量是分配在內存的靜態存儲區的,非靜態的局部變量,包括形參是分配在內存的動態
    的頭像 發表于 03-10 15:30 ?984次閱讀

    c語言數組查找指定元素

    的操作,本文將詳細介紹C語言中如何在數組中進行查找,并提供幾種常用的查找算法和技巧。 在開始之前,我們先來了解一下數組的基本概念和使用方法。數組
    的頭像 發表于 11-24 10:07 ?4756次閱讀

    C語言如何創建數組

    用法和注意事項。 要創建一個數組,首先需要確定數組的數據類型和大小。C語言中的數據類型包括基本數據類型(如整數、浮點數、字符等)以及派生數據類型(如
    的頭像 發表于 11-24 10:08 ?2304次閱讀

    c語言中數組怎么定義

    C語言中數組是一種用來存儲相同類型元素的數據結構。它可以存儲多個元素,并通過一個共同的名稱來引用這些元素。數組是一種很重要的數據結構,可以用于解決很多實際的問題。 在
    的頭像 發表于 11-24 10:11 ?3611次閱讀

    c語言中多維數組可以嵌套定義

    C語言中多維數組可以嵌套定義,這使得我們可以在一個數組存儲另一個數組。通過這種方式,我們可以創
    的頭像 發表于 11-24 10:18 ?1417次閱讀

    數組和鏈表在內存的區別 數組和鏈表的優缺點

    數組和鏈表在內存的區別 數組和鏈表的優缺點? 數組和鏈表是常見的數據結構,用于組織和存儲數據。它們在內
    的頭像 發表于 02-21 11:30 ?1338次閱讀
    主站蜘蛛池模板: 日本三级视频 | 久久久噜噜噜久久网 | 中文字幕有码在线视频 | 国内久久久久高清影视 | 亚洲欧美一区二区久久香蕉 | 日韩高清在线日韩大片观看网址 | 色婷婷亚洲综合五月 | 色视频在线观看免费 | 中文字幕一二三区乱码老 | 五月婷色| 高颜值大长腿美女啪啪 | 天天操天天干天天射 | 亚洲午夜久久久久影院 | 亚洲www视频 | 亚洲视频在线一区二区 | 午夜在线播放视频 | 天天色影院 | 成年人在线网站 | 五月综合色婷婷影院在线观看 | 色咪网 | 99久久99久久| 国产青草| 国内91视频| 欧美色图在线视频 | 美女黄18以下禁止观看 | 午夜视频在线 | 色婷婷影视 | 黄色aaaa| 欧美交片 | avt天堂网| 日韩免费观看一级毛片看看 | 被暗卫肉高h | 亚洲一区区 | 国内一级毛片 | 人人射人人插 | 天天色天天综合 | 综合精品| 韩毛片 | 午夜视频网站在线观看 | 日本高清视频在线www色 | 国产一级又色又爽又黄大片 |