看板 C_and_CPP 關於我們 聯絡資訊
各位好! 小弟想了解宣告是記憶體的配置方式,遇到一些問題。 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
school4303: 因為這樣宣告是在stack裡 記憶體是從大的往小的要07/20 14:07
KaryuuIssen: 你看反了 a3是0x62fe40~48 a1是0x62fe3c~4007/20 14:07
school4303: a3是40-4707/20 14:07
KaryuuIssen: 恩 不包含結尾07/20 14:09
nh60211as: 你自己先畫出來看吧,你都說int是4bytes07/20 14:11
我知道區域變數是存stack裡面,但有點搞不清楚實際操作的儲存方式。 所以我一開始的觀念是第一張圖 https://i.imgur.com/jIzBkvZ.jpg
但是實際操作的時候正確的觀念應該是第二張圖對吧? https://i.imgur.com/u7whltJ.jpg
如果還有錯,請各位指教! 謝謝 ※ 編輯: OnlyCourage (49.218.65.223 臺灣), 07/20/2019 14:51:09
school4303: 對 是圖二沒錯 只是你a2a5的位址標錯07/20 17:04
喔對!我打錯了,應該是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
nh60211as: http://cpp.sh/2ysst 07/20 19:42
nh60211as: 你試試這個程式碼,應該要看記憶體實際的內容 07/20 19:43
nh60211as: 不要猜他的記憶體位置塞了什麼東西 07/20 19:43
nh60211as: 最好的方法應該是找個可以看記憶體的debugger 07/20 19:47
loveme00835: 宣告不佔記憶體 07/20 19:49
nh60211as: 更新一下 http://cpp.sh/9axh7 07/20 20:02
KaryuuIssen: 對齊問題 0x62fe40才能被8整除 07/22 17:03