看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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)
Schottky:按一下 Ctrl-Alt-F7 10/02 16:30
damody:推樓上 請 重建 看看 10/02 18:43
licheer:clean又rebuild好幾次,結果都一樣不對,真是怪 10/03 11:19
Schottky:有兩個方法, 你分開來試試看: 10/03 12:13
Schottky:1.把MemStruct多加一個int Reserved1;也就是湊足64 bits 10/03 12:14
Schottky:2.在struct MemStruct定義前面加 #pragma pack(push,4) 10/03 12:15
Schottky: 後面加 #pragma pack(pop) 更改此struct的對齊值 10/03 12:17
※ 編輯: licheer 來自: 60.249.12.145 (10/03 14:03) ※ 編輯: licheer 來自: 60.249.12.145 (10/03 14:35)
Ebergies:之前沒看... 沒想到這個問題還蠻特別的 10/03 15:13
Schottky:static變數你沒特別去initialize就不會是0 10/03 16:42
Schottky:雖然文中的code看來沒問題,但我強烈懷疑實際的code 10/03 16:43
Schottky:差了一個 & 符號... 10/03 16:43
Schottky:你把 warning message 全開, 看看有沒有可疑的 warning 10/03 16:43
Schottky:或者已經滿是 warning 了根本沒去注意看? XD 10/03 16:44
Ebergies:static 一般一定是 0 喔, 這個是開 clr:pure 的關係 10/03 23:05
Ebergies:嗯... 查了一下,又不太確定了,話還是不要說太死 LOL 10/03 23:29