Re: [問題] 指標的用法....

看板C_and_CPP作者 (小水)時間13年前 (2010/10/18 21:16), 編輯推噓0(005)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《BlueSkyDream (人生是後悔的連續)》之銘言: : 請問一下 : 目前使用的是Keil C : 在定義一個陣列如下的情況 : BYTE data Data[2]; 這邊只宣告了兩個byte的記憶體 假設Data是宣告在0x00001000 所以 可以使用0x00001000與0x00001001 : 之後用到Data[]來計算的過程如下 : ((WORD *)Data)[0] = 一堆計算式 這邊是將一堆算式的結果 塞到0x00001000與0x00001001 因為你轉型成WORD* 一次是2byte : ((WORD *)Data)[1] = 一堆計算式 這邊是將一堆算式的結果 塞到0x00001002與0x00001003 : 請問在((WORD *)Data)[1]計算完後會不會破壞到((WORD *)Data)[0]內的資料? : 若不會,那原因是? 所以((WORD *)Data)[1]不會覆蓋掉((WORD *)Data)[0]內的資料 但是.. 這個寫法是非常嚴重的錯誤 假設 BYTE data Data[2]; 是區域變數 那麼是宣告在堆疊中 因此 你毀掉堆疊中某個無辜的記憶體 可能是覆寫別人的變數(看起來沒事) 可是是毀掉某個指標(代表它亂指了..暫時沒事..可是當一讀指標就知道了) 可能是毀掉返回位址(程式肯定當掉) 如果是全域變數的話 可能是毀掉別人的變數 可能是寫到合法位址..但沒人使用(這時候就沒事) 可能是寫到不合法位址(程式肯定當掉) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.127.112

10/18 21:27, , 1F
回文時沒有發現BYTE後面有data,所以有些說法可能不適用
10/18 21:27, 1F

10/18 21:29, , 2F
但是確定不會覆蓋((WORD *)Data)[0],會覆蓋別人
10/18 21:29, 2F

10/19 00:11, , 3F
補衝一下,((WORD *)Data)[1] 意思是
10/19 00:11, 3F

10/19 00:12, , 4F
*((WORD)*(data) + 1) 所以這的平移量是 一個WORD
10/19 00:12, 4F

10/19 00:13, , 5F
以致從0x00001002開始
10/19 00:13, 5F
文章代碼(AID): #1Cl4YdjZ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Cl4YdjZ (C_and_CPP)