2010-02-16 2 views
1

처음 쓰레드를 쓰고 싶습니다. 그래서 지금은 쓰레드를 완전히 이해하지 못합니다.pParam을 캐스팅 한 후 왜 임의의 문자를 다시 얻습니까?

내가 두 구조가 : 내 스레드에 MSG2이 구조를 "전송"할

struct ddata //difference content 
{ 
    char *filename; 
    char *size; 
}; 
struct ddata *difference = (struct ddata *) malloc(dif * sizeof *difference);  

struct test 
{ 
struct ddata* difference; 
int diff; 
}; 
struct test *MSG2; 
MSG2 = (struct test*)malloc(sizeof(test)); 

MSG2->difference = difference; 
MSG2->diff = diff; 

, 그리고 내가 그것을 이런 식으로했다 :

CreateThread( 
     NULL,     // default security attributes 
     0,      // use default stack size 
     CopyThread,  // thread function name 
     &MSG2,   // argument to thread function 
     0,      // use default creation flags 
     NULL); 

그리고 지금을, 여기에 내 온다 문제. 내 스레드에서, 나는 pParam 다시 캐스팅하고, 그것을 테스트하기 위해 일부 데이터를 인쇄하고 싶지만 임의의 문자가 나타납니다. 내 스레드 :

DWORD WINAPI CopyThread(LPVOID pParam) 
{ 
    char a[100]; 
    test *Test = (test*)(pParam); 
    sprintf(a, "diff: %s", Test->difference->filename); 
MessageBoxA(NULL,a,0,0); 
} 

내가 뭘 잘못하고 있니?

미리 감사드립니다.

kampi

답변

0

나는 내 문제가 무엇인지 파악 :

당신은에 CreateThread에 전화를 변경해야합니다. 내가 테스트 구조를 선언했을 때 나는 거기에 여분의 것을 두었다.

struct test 
{ 
    struct ddata* difference; 
    int diff; 
}; 
struct test *MSG2; <-- here 

내가 시작을 제거하면 , 그것은 잘 작동 : 당신의 도움에 대한

struct test MSG2; 

감사합니다!

kampi

1

CopyThread가 관련 데이터로 테스트 *를받을 것으로 예상되지만 테스트 ** 전달되기 때문이다 - 관련 데이터에 대한 포인터에 대한 포인터를. 그런 다음 CopyThread에서 테스트 *로 캐스팅하면 임의의 문자가 생성됩니다.

CreateThread( 
     NULL,     // default security attributes 
     0,      // use default stack size 
     CopyThread,  // thread function name 
     MSG2,   // argument to thread function 
     0,      // use default creation flags 
     NULL); 
+0

그래, 또 다른 무효 피해자. 스레드가 시작될 때까지 범위를 벗어난 포인터는 다음 바이트가 될 수 있습니다. –

+0

안녕하세요! MSG2 이전에 '&'를 제거하면 응용 프로그램이 정지됩니다. ( – kampi

관련 문제