[問題] CLI/C++ Struct Array 溢位的問題

看板C_and_CPP (C/C++)作者 (HOPE)時間12年前 (2013/10/02 16:13), 編輯推噓3(3012)
留言15則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) CLI/C++, VC2005 Code: typedef struct { int Member1; int Member2; int Member3; } MemStruct; static MemStruct MemberGroup[10]; MemberGroup[0].Member1 = 11; MemberGroup[0].Member2 = 12; MemberGroup[0].Member3 = 13; 進入debug看變數內容, 照理講在給值之前, Member1~3應該都要等於0 但卻是亂七八糟的數值, 給值之後, 內容也沒變化 反倒是填到MemberGroup[1], 位置也不對 Value: MemberGroup[0].Member1 : 0 -> 12 MemberGroup[0].Member2 : 0 -> 13 MemberGroup[0].Member3 : 0 換另一個方式去看內容, 結果是正確的 MemStruct* p = MemberGroup; Value: p->Member1 : 11 p->Member2 : 12 p->Member3 : 13 真詭異, 怎會這樣呢? 請各位大大指點, 謝謝 // 重新Compile了幾次,不論#pragma pack加或不加 從debug看到的值是錯的,但取出來的值正確 且 value = MemberGroup[0].Member1 value : 12 正確 value = p->Member1 value : 12344 錯誤 // 找到原因 Common Language Runtime Support 從(/clr:pure)改為(/clr)就可以了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.249.12.145 ※ 編輯: licheer 來自: 60.249.12.145 (10/02 16:14)

10/02 16:30, , 1F
按一下 Ctrl-Alt-F7
10/02 16:30, 1F

10/02 18:43, , 2F
推樓上 請 重建 看看
10/02 18:43, 2F

10/03 11:19, , 3F
clean又rebuild好幾次,結果都一樣不對,真是怪
10/03 11:19, 3F

10/03 12:13, , 4F
有兩個方法, 你分開來試試看:
10/03 12:13, 4F

10/03 12:14, , 5F
1.把MemStruct多加一個int Reserved1;也就是湊足64 bits
10/03 12:14, 5F

10/03 12:15, , 6F
2.在struct MemStruct定義前面加 #pragma pack(push,4)
10/03 12:15, 6F

10/03 12:17, , 7F
後面加 #pragma pack(pop) 更改此struct的對齊值
10/03 12:17, 7F
※ 編輯: licheer 來自: 60.249.12.145 (10/03 14:03) ※ 編輯: licheer 來自: 60.249.12.145 (10/03 14:35)

10/03 15:13, , 8F
之前沒看... 沒想到這個問題還蠻特別的
10/03 15:13, 8F

10/03 16:42, , 9F
static變數你沒特別去initialize就不會是0
10/03 16:42, 9F

10/03 16:43, , 10F
雖然文中的code看來沒問題,但我強烈懷疑實際的code
10/03 16:43, 10F

10/03 16:43, , 11F
差了一個 & 符號...
10/03 16:43, 11F

10/03 16:43, , 12F
你把 warning message 全開, 看看有沒有可疑的 warning
10/03 16:43, 12F

10/03 16:44, , 13F
或者已經滿是 warning 了根本沒去注意看? XD
10/03 16:44, 13F

10/03 23:05, , 14F
static 一般一定是 0 喔, 這個是開 clr:pure 的關係
10/03 23:05, 14F

10/03 23:29, , 15F
嗯... 查了一下,又不太確定了,話還是不要說太死 LOL
10/03 23:29, 15F
文章代碼(AID): #1IIzMmhZ (C_and_CPP)
文章代碼(AID): #1IIzMmhZ (C_and_CPP)