2015-11-24 63 views
0

我通過structCreateThread()函數。在另一臺機器上的相同的代碼工作正常。但在我的機器上,「SendItem」總是變爲0xccccccc Bad Ptr>。有誰知道爲什麼?CreateThread()奇怪地傳遞結構參數

.... 
myStruct mystruct; 
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendItem,(LPVOID)&mystruct, 0, &thread); 
... 

DWORD WINAPI SendItem(LPVOID lpParam) 
{ 
    myStruct* SendItem= (myStruct*) lpParam; 
    ... 
} 

struct myStruct 
{ 
    char Name [256]; 
    int ID; 
}; 

回答

6
.... 
myStruct mystruct; 
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendItem,(LPVOID)&mystruct, 0, &thread); 
... 

你沒有表現出實際的代碼,但是這大概是在一個函數的地方。

您正在將局部變量的地址傳遞給您的線程函數。問題是,只要包含函數返回,局部變量就會被銷燬。

的解決方案是在堆上分配對象:

void start_thread(void) 
{ 
    myStruct *mystruct = malloc(sizeof(*mystruct)); 
    if (!mystruct) 
     return; 

    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendItem, (LPVOID)mystruct, 0, &thread); 
} 
+0

是不是的CreateThread的第三個參數()的函數?在我的例子中,'SendItem'實際上是'DWORD WINAPI SendItem(LPVOID lpParam)'和'(LPVOID)&mystruct'是'SendItem()'的參數' –

+0

@MinKim這就是爲什麼你發佈* full *例子,而不是小片段無法編譯。 –

+0

我得到錯誤C2440:'初始化':無法從'void *'轉換爲'mystruct *' –