[問題] 宣告的記憶體空間和位址

看板C_and_CPP作者 (An)時間4年前 (2019/07/20 13:51), 4年前編輯推噓2(319)
留言13則, 4人參與, 4年前最新討論串1/1
各位好! 小弟想了解宣告是記憶體的配置方式,遇到一些問題。 double a4, a3; int a1, a2, a5; 分別print這五個變數的記憶體位址如下 a1>0x62fe3c a2>0x62fe38 a3>0x62fe40 a4>0x62fe48 a5>0x62fe34 編譯的時候會先a4, a3, a1, a2, a5依序建立,double為8bytes,int為4bytes。 我的問題是a4到a3佔了8bytes,但是a3為double型態,為什麼到a1卻只有4bytes呢?不是應 該8bytes,而a1從0x62fe38開始嗎? 謝謝各位指教! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.218.65.223 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1563601905.A.A8D.html

07/20 14:07, 4年前 , 1F
因為這樣宣告是在stack裡 記憶體是從大的往小的要
07/20 14:07, 1F

07/20 14:07, 4年前 , 2F
你看反了 a3是0x62fe40~48 a1是0x62fe3c~40
07/20 14:07, 2F

07/20 14:07, 4年前 , 3F
a3是40-47
07/20 14:07, 3F

07/20 14:09, 4年前 , 4F
恩 不包含結尾
07/20 14:09, 4F

07/20 14:11, 4年前 , 5F
你自己先畫出來看吧,你都說int是4bytes
07/20 14:11, 5F
我知道區域變數是存stack裡面,但有點搞不清楚實際操作的儲存方式。 所以我一開始的觀念是第一張圖 https://i.imgur.com/jIzBkvZ.jpg
但是實際操作的時候正確的觀念應該是第二張圖對吧? https://i.imgur.com/u7whltJ.jpg
如果還有錯,請各位指教! 謝謝 ※ 編輯: OnlyCourage (49.218.65.223 臺灣), 07/20/2019 14:51:09

07/20 17:04, 4年前 , 6F
對 是圖二沒錯 只是你a2a5的位址標錯
07/20 17:04, 6F
喔對!我打錯了,應該是0x62fe38, 0x62fe34!感謝! 不過我有遇到另一個問題了! double a1; int a2; print出來是 a1>0x62fe48 a2>0x62fe44 這邊沒有問題,但是反過來宣告就怪了 int a1; double a2; print出來是 a1>0x62fe4c a2>0x62fe40 變成a2原本佔得記憶體為8bytes,卻變成12bytes,理論上a2應該要是0x62fe44不是嗎? 謝謝各位 ※ 編輯: OnlyCourage (49.218.65.223 臺灣), 07/20/2019 18:09:20

07/20 19:42, 4年前 , 7F
07/20 19:42, 7F

07/20 19:43, 4年前 , 8F
你試試這個程式碼,應該要看記憶體實際的內容
07/20 19:43, 8F

07/20 19:43, 4年前 , 9F
不要猜他的記憶體位置塞了什麼東西
07/20 19:43, 9F

07/20 19:47, 4年前 , 10F
最好的方法應該是找個可以看記憶體的debugger
07/20 19:47, 10F

07/20 19:49, 4年前 , 11F
宣告不佔記憶體
07/20 19:49, 11F

07/20 20:02, 4年前 , 12F
更新一下 http://cpp.sh/9axh7
07/20 20:02, 12F

07/22 17:03, 4年前 , 13F
對齊問題 0x62fe40才能被8整除
07/22 17:03, 13F
文章代碼(AID): #1TCglngD (C_and_CPP)