色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言中數(shù)組在內(nèi)存中如何表示

jf_78858299 ? 來源:碼農(nóng)的荒島求生 ? 作者:陸小風(fēng) ? 2023-02-15 14:35 ? 次閱讀

C語言中數(shù)組在內(nèi)存中是怎樣表示的,今天就給大家聊聊這個(gè)話題。

開局一張圖:

圖片

這個(gè)是經(jīng)典的Linux進(jìn)程內(nèi)存布局,通常我們使用的數(shù)據(jù)存在這樣幾個(gè)地方:

  • 棧區(qū),Stack
  • 全局區(qū),Global
  • 堆區(qū),Heap

接下來我們分別看一下C語言中的數(shù)組在這幾個(gè)區(qū)域是怎樣表示的,注意,小風(fēng)哥的機(jī)器是x86 64位。

數(shù)組與棧區(qū)

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

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];
}

我們定義了一個(gè)局部變量arr作為int類型的數(shù)組,然后分別將100-600寫到了數(shù)組中,那么數(shù)組arr在內(nèi)存中是怎樣表示的呢?

首先我們編譯一下:

# gcc -g -fno-stack-protector a.c

注意,-fno-stack-protector選項(xiàng)是為了禁止堆棧保護(hù),讓匯編更容易懂些,關(guān)于堆棧保護(hù)這個(gè)話題可以參考這篇文章《黑客攻防:緩沖區(qū)溢出攻擊與堆棧保護(hù)》。

好啦,一切準(zhǔn)備就緒,可以庖丁解牛啦,使用的刀就是gdb,代碼面前了無秘密,gdb面前程序的運(yùn)行時(shí)(run time)了無秘密。

用gdb來調(diào)試剛剛編譯出來的程序,這里看一下arr_on_stack函數(shù)的匯編指令:

(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.

我們?cè)谥暗奈恼隆?a href="http://m.1cnz.cn/outside?redirect=http://mp.weixin.qq.com/s?__biz=Mzg4OTYzODM4Mw==&mid=2247485714&idx=1&sn=1a315fe4da87fde2758fc9dd5366ba01&chksm=cfe99592f89e1c84b87ebfbfbbbd9868ddf3e945666168122f57aa793e87787528b513e46e5d&scene=21#wechat_redirect" target="_blank">函數(shù)在內(nèi)存中是怎樣表示的?》多次提到過,每個(gè)函數(shù)在運(yùn)行起來后都有屬于自己的棧幀,棧幀組成棧區(qū),此時(shí)arr_on_stack這個(gè)函數(shù)的棧區(qū)在哪里呢?答案就在寄存器rbp中。

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

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

啊哈,原來?xiàng)?x7ffffffee2a0這個(gè)地方,那么我們的數(shù)組arr在哪里呢?別著急,這條指令會(huì)告訴我們答案:

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

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

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

因此,我們預(yù)測arr應(yīng)該在0x7ffffffee280這個(gè)位置上。

接下來我們用gdb驗(yàn)證一下:

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

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

這就是C語言中所謂的數(shù)組了, 無非就是從0x7ffffffee280 到 0x7ffffffee298這一段內(nèi)存嘛 ,數(shù)組在棧區(qū)就是這么表示的!

數(shù)組與全局區(qū)

同樣看一段代碼:

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加斷點(diǎn)在int b = global_array[0]這行代碼,看下全局變量global_array的內(nèi)存位置:

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

gdb告訴我們數(shù)組global_array存放在內(nèi)存0x601050這個(gè)地址上。

注意0x601050這個(gè)地址和剛才看到的0x7ffffffee280這個(gè)地址相去甚遠(yuǎn),為什么呢?

再看下開局那張圖:圖片

全局區(qū)幾乎在最底部,棧區(qū)在最頂部,所以相差很遠(yuǎn)。

接下來讓我們看看0x601050這個(gè)內(nèi)存區(qū)域中到底保存了些啥?

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

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

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

這就是C語言中所謂的數(shù)組了, 無非就是從 0x601050到 0x601068這一段內(nèi)存嘛 ,數(shù)組在全局區(qū)就是這么表示的!

數(shù)組與堆區(qū)

來段代碼:

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加斷點(diǎn)在int a = arr[0];這行代碼,然后打印數(shù)組arr的地址:

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

注意0x602010這個(gè)地址,這個(gè)地址和剛才的全局?jǐn)?shù)組global_array的地址0x601050比較接近,因?yàn)槎褏^(qū)和全局區(qū)挨得比較近,可以再回過頭看一下開局那張圖。

然后我們同樣使用x命令查看這個(gè)區(qū)域的內(nèi)存內(nèi)容:

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

依然不出我們所料,這個(gè)區(qū)域保存的正是數(shù)組的值。

圖片

這就是C語言中所謂的數(shù)組了, 無非就是從 0x602010到 0x602028這一段內(nèi)存嘛 ,數(shù)組在堆區(qū)就是這么表示的!

現(xiàn)在你應(yīng)該明白了吧,C語言中所謂的數(shù)組是怎么表示的?很簡單,其實(shí)也沒啥表示, 無非就是內(nèi)存中一段連續(xù)的空間 ,僅此而已。

希望這篇文章對(duì)大家理解C語言中的數(shù)組有所幫助。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3052

    瀏覽量

    74214
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137422
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    417

    瀏覽量

    26001
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    淺談C語言中數(shù)組在內(nèi)存的存在形式

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

    小數(shù)在內(nèi)存是如何存儲(chǔ)的?為什么C語言中的浮點(diǎn)數(shù)不支持位移操作?

    小數(shù)在內(nèi)存是如何存儲(chǔ)的?為什么C語言中的浮點(diǎn)數(shù)不支持位移操作?
    發(fā)表于 08-16 09:24 ?1096次閱讀
    小數(shù)<b class='flag-5'>在內(nèi)存</b><b class='flag-5'>中</b>是如何存儲(chǔ)的?為什么<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的浮點(diǎn)數(shù)不支持位移操作?

    C語言中數(shù)組和結(jié)構(gòu)體的內(nèi)存表示和布局

    C語言中數(shù)組和結(jié)構(gòu)體都可以代表一塊內(nèi)存,但為什么結(jié)構(gòu)體可以直接賦值,而數(shù)組不可以?這個(gè)問題涉及到C
    發(fā)表于 08-28 10:54 ?1710次閱讀

    C語言中數(shù)組的用法

    C語言數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它可以存儲(chǔ)多個(gè)相同類型的數(shù)據(jù),例如整數(shù),字符,浮點(diǎn)數(shù)等。數(shù)組的每個(gè)元素都有一個(gè)索引,用來表示它在
    的頭像 發(fā)表于 11-24 17:48 ?1355次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b><b class='flag-5'>數(shù)組</b>的用法

    如何使用單片機(jī)的C語言中數(shù)組

    如何使用單片機(jī)的C語言中數(shù)組
    發(fā)表于 10-15 08:59

    單片機(jī)C語言中常用的基本數(shù)據(jù)類型分為哪幾類

    不管在什么語言中,定義一個(gè)變量時(shí)必然要在內(nèi)存開辟一個(gè)相應(yīng)大小的空間來存儲(chǔ)該變量。不同的數(shù)據(jù)類型在內(nèi)存所占的空間大小不同,其所能表示的數(shù)據(jù)范
    發(fā)表于 02-28 06:46

    C語言中的char數(shù)組和char指針有什么區(qū)別?

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

    C語言中數(shù)組空間動(dòng)態(tài)開辟

    C語言中數(shù)組空間動(dòng)態(tài)開辟 在C語言中,必不可少的需要使用到數(shù)組,通常為了動(dòng)態(tài)的開辟
    的頭像 發(fā)表于 02-10 12:42 ?2211次閱讀

    C語言中什么是指針數(shù)組

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

    C語言怎么建立內(nèi)存的動(dòng)態(tài)分配

    C語言中,全局變量是分配在內(nèi)存的靜態(tài)存儲(chǔ)區(qū)的,非靜態(tài)的局部變量,包括形參是分配在內(nèi)存的動(dòng)態(tài)
    的頭像 發(fā)表于 03-10 15:30 ?874次閱讀

    c語言數(shù)組查找指定元素

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

    C語言如何創(chuàng)建數(shù)組

    用法和注意事項(xiàng)。 要?jiǎng)?chuàng)建一個(gè)數(shù)組,首先需要確定數(shù)組的數(shù)據(jù)類型和大小。C語言中的數(shù)據(jù)類型包括基本數(shù)據(jù)類型(如整數(shù)、浮點(diǎn)數(shù)、字符等)以及派生數(shù)據(jù)類型(如
    的頭像 發(fā)表于 11-24 10:08 ?1993次閱讀

    c語言中數(shù)組怎么定義

    C語言中,數(shù)組是一種用來存儲(chǔ)相同類型元素的數(shù)據(jù)結(jié)構(gòu)。它可以存儲(chǔ)多個(gè)元素,并通過一個(gè)共同的名稱來引用這些元素。數(shù)組是一種很重要的數(shù)據(jù)結(jié)構(gòu),可以用于解決很多實(shí)際的問題。 在
    的頭像 發(fā)表于 11-24 10:11 ?3216次閱讀

    c語言中多維數(shù)組可以嵌套定義

    C語言中多維數(shù)組可以嵌套定義,這使得我們可以在一個(gè)數(shù)組存儲(chǔ)另一個(gè)數(shù)組。通過這種方式,我們可以創(chuàng)
    的頭像 發(fā)表于 11-24 10:18 ?1215次閱讀

    數(shù)組和鏈表在內(nèi)存的區(qū)別 數(shù)組和鏈表的優(yōu)缺點(diǎn)

    數(shù)組和鏈表在內(nèi)存的區(qū)別 數(shù)組和鏈表的優(yōu)缺點(diǎn)? 數(shù)組和鏈表是常見的數(shù)據(jù)結(jié)構(gòu),用于組織和存儲(chǔ)數(shù)據(jù)。它們在內(nèi)
    的頭像 發(fā)表于 02-21 11:30 ?1108次閱讀
    主站蜘蛛池模板: 亚洲国产在线午夜视频无 | 在线观看免费av网 | 美女动态图真人后进式 | 在线精品视频免费观看 | 亚洲国产系列一区二区三区 | 黑人寄宿羽月希产后奶水 | 久久精品影院永久网址 | 美美哒免费影视8 | 蜜桃成熟时2在线观看完整版hd | 在线亚洲中文字幕36页 | 红桃传媒少妇人妻网站无码抽插 | 高清观看ZSHH96的视频素材 | 中文字幕人成人乱码亚洲影视S | 国产v综合v亚洲欧美大片 | 国语自产视频在线 | 国产精品成人在线播放 | 久久www免费人成_看片高清 | 海角社区在线视频播放观看 | 午夜福利免费院 | 日韩欧无码一区二区三区免费不卡 | 蜜芽亚洲欧美一区二区电影 | 俄罗斯乌克兰战争原因 | 国产亚洲精品久久久久久无码网站 | 欧美顶级情欲片免费看 | YY8090福利午夜理论片 | 日韩精品AV一区二区三区 | 最新无码国产在线视频 | 乌克兰黄色录像 | 三级网站视频在线观看 | 欧美精品高清在线观看 | 超碰v | 久久久久久久久免费视频 | 日韩av片无码一区二区不卡电影 | 恋夜直播午夜秀场最新 | 欧美亚洲另类图片 | 国产在线精品视频资源 | 欧美506070 | zooskoo1videos人与狗 | 亚洲精品卡2卡3卡4卡5卡区 | 在线欧美精品一区二区三区 | yin乱教师系列合集 yin荡体育课羞耻play双性 |