编译器在第3行说“非法间接”.IDE说“表达式必须是指向完整对象类型的指针”
001 DWORD WINAPI MyCallbackFunction( LPVOID lpvParam )
002 {
003 long value = (long) *lpvParam;
004 ...
005 return 0;
006 }
007
008 BOOL StartMyThread( long value )
009 {
010 DWORD dwThreadId;
011 BOOL result = FALSE;
012 HANDLE hThread = NULL;
013 hThread = CreateThread(NULL, 0, MyCallbackFunction, &value, NULL, &dwThreadId );
014 result = (NULL == hThread);
015 CloseHandle( hThread );
016 return result;
017 }
如果我将第3行更改为此,则会编译,但崩溃...
long value = (long) lpvParam;
答案 0 :(得分:4)
您正在尝试使用void*
指针,这是不允许的。你必须先将它转换为另一个指针类型。由于您的参数是指向long
的指针,因此您需要执行此操作:
long *value = (long*) lpvParam;
或者,如果线程不需要访问原始变量:
long value = * (long*) lpvParam;
但是塞思是对的。在线程实际开始运行时,原始变量将消失。如果您尝试将其值传递给线程,请执行以下操作:
// notice the '&' operator is gone now...
hThread = CreateThread(NULL, 0, MyCallbackFunction, (LPVOID)value, NULL, &dwThreadId );
...
long value = (long) lpvParam;
答案 1 :(得分:1)
您正在给出一个指向本地变量的指针,该变量可以被线程运行的类型销毁。最好在long
的调用中将LPVOID
转换为CreateThread
,然后将其强制转换为long
(请注意,没有指针取消引用发生)MyCallbackFunction
内。