看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
wendly777:回文時沒有發現BYTE後面有data,所以有些說法可能不適用 10/18 21:27
wendly777:但是確定不會覆蓋((WORD *)Data)[0],會覆蓋別人 10/18 21:29
d85631566:補衝一下,((WORD *)Data)[1] 意思是 10/19 00:11
d85631566:*((WORD)*(data) + 1) 所以這的平移量是 一個WORD 10/19 00:12
d85631566:以致從0x00001002開始 10/19 00:13