2015-05-06 139 views
0

在以下示例中,一旦我們訪問bar屬性,其值將自動更改。使用後更改了結構屬性

typedef struct { 
    DWORD bar; 
} MYTYPE; 

void Create(LPVOID *myTypePtr) 
{ 
    MYTYPE myType; 
    myType.bar = 50; 
    *myTypePtr = &myType; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DWORD foo; 
    MYTYPE *fooPtr; 

    Create((LPVOID)&foo); 
    fooPtr = (MYTYPE*)foo; 

    printf("%d\n", fooPtr->bar); // This prints 50 (ok). 
    printf("%d\n", fooPtr->bar); // This prints 2147344384 (garbage). 

    return 0; 
} 

是的,結構必須作爲void指針傳遞。我可能錯過了一些轉換細節,但我無法得到它。用Visual C++ 2003編譯。

任何想法?

回答

1

在函數Create中,您將參數myTypePtr指向本地自動變量myType。當函數退出時,變量myType超出範圍,所以它是未定義的行爲,用於在函數退出後取消引用指向它的指針。

+0

真的,謝謝! – cdonts