Re: [問題] 要抓出存放Array Size的記憶體位置

看板C_and_CPP (C/C++)作者 (我是湯姆貓 不是傑利薯)時間16年前 (2009/10/05 22:20), 編輯推噓4(4017)
留言21則, 6人參與, 最新討論串3/3 (看更多)
感謝VictorTom以及adrianshum的提示 我發現我的兩個錯誤了 1. 我誤會教授的意思,教授所說的是"arr"這個pointer所指的位置 而不是說"arr"本身的所在位置 ORZ 2. intptr+1會一次跳4個byte, 要用charptr+1,才會一個byte一個byte慢慢跳。 以下是我修改過的code char *byteptr = (char *) (arr) //強制取出arr "所指的" 的記憶體位址 for (int k = 0; k < 50; k++ ) cout << *((int *)(byteptr - k)) << endl //把arr"所指的"位址之前的記憶體全部掃瞄過一遍 以下是輸出結果: 0 0 0 0 17 ... ... 看來"17"這個數字 是位於arr"所指的"記憶體位置的前四個byte 已經找到初步的解法了 在此感謝大家的協助<(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.243.205 ※ 編輯: jerrypotato 來自: 140.112.243.205 (10/05 22:21)

10/05 22:23, , 1F
原來大小真的會放在配下去的heap前面的address啊Orz
10/05 22:23, 1F

10/05 22:24, , 2F
總覺得把heap管理用的資訊和heap的data放在一起有點詭異
10/05 22:24, 2F

10/05 22:25, , 3F
雖然說我們自己寫code都會把相關的資料放一起, 可是heap
10/05 22:25, 3F

10/05 22:25, , 4F
size直接放data旁邊, AP只要有一些錯誤的記憶體操作不就
10/05 22:25, 4F

10/05 22:25, , 5F
有機會直接crash掉heap管理系統?_?
10/05 22:25, 5F

10/05 22:27, , 6F
我想要請問原po使用的作業系統與編譯環境
10/05 22:27, 6F

10/05 22:34, , 7F
懷疑不同環境會有差異嗎?? 其實我也覺得不同lib實作可能
10/05 22:34, 7F

10/05 22:35, , 8F
有差說XD
10/05 22:35, 8F

10/05 22:35, , 9F
呵呵 Good Job
10/05 22:35, 9F

10/05 22:36, , 10F
我的作業系統是Linux 使用語言是C++ 編譯器是g++
10/05 22:36, 10F

10/05 22:37, , 11F
我不知道欸 說不定這種安排只有在Linux才會出現...?
10/05 22:37, 11F

10/05 22:37, , 12F
因為在微軟的VC上看不到相似的東西 我想可能是平台相依
10/05 22:37, 12F

10/05 22:45, , 13F
跟 malloc 怎麼實作有關吧, 我有看過把 meta 就放在 slot 前
10/05 22:45, 13F

10/05 22:45, , 14F
後的 paper
10/05 22:45, 14F

10/05 22:45, , 15F
講 memory management 的 (well, 不確定是不是 paper)
10/05 22:45, 15F

10/05 22:48, , 16F
反正不小心寫超過, 把 heap 寫壞掉了本來就是 coder 該死 XD
10/05 22:48, 16F

10/06 13:11, , 17F
剛剛測了一下Windows XP VC 7.1 和
10/06 13:11, 17F

10/06 13:11, , 18F
linux 2.6.30 & g++ 4.3.4..
10/06 13:11, 18F

10/06 13:11, , 19F
這兩個都會把heap上allocate空間的meta放在slot前面
10/06 13:11, 19F

10/06 13:12, , 20F
size的資訊都是以byte為單位..
10/06 13:12, 20F

10/06 13:13, , 21F
前者的meta長達48個bytes..後者才16個bytes XD
10/06 13:13, 21F
文章代碼(AID): #1AoW2qqP (C_and_CPP)
文章代碼(AID): #1AoW2qqP (C_and_CPP)