作者licheer (HOPE)
看板C_and_CPP
標題[問題] CLI/C++ Struct Array 溢位的問題
時間Wed Oct 2 16:13:33 2013
開發平台(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