(LPVOID)형태의 타입캐스팅에 대하여...
아래와 같은 코드에서 CreateThread함수의 4번째 인자를 넘길떄 생기는 타입캐스팅에 대해서 질문드립니다.
우선 아래와 같은 코드에서 각각 (LPVOID)cntOfThread,(LPVOID)(¶mThread[2])형태로 타입캐스팅을 하는데
굳이 저렇게 명시적으로 타입캐스팅을 하지 않아도 4번째 인자가 LPVOID 타입이기 떄문에 동작 상 문제가 없을 것 같던데,
결과 값이 다르게 나오더군요.
첫번쨰 코드는 cntOfThread가 DWORD 인데, 이를 (LPVOID)cntOfThread 해서 4번쨰 인자를 초기화 해서 접근 하는 것이 정확히 어떤것인지 잘 이해가 되지 않습니다.
두번쨰 코드는 (LPVOID)(¶mThread[2])형태인데, 이는 첫번쨰 코드에서 피연산자가 일반 변수값이었는데 ,
이번엔 배열의 2번쨰 요소에 대한 주소값을 VOID 형태로 바꿔서 4번쨰 인자를 초기화 하는 걸로 이해하고 있습니다.
(LPVOID)형태의 명시적 형변환이 왜 필요한 것인가요 ?
4번째 인자가 VOID 형 포인터이기 떄문에 형 변환이 꼭 필요하지 않아도 되지 않나요?
필요하지 않는데 왜 동작상에 문제가 생기는지 이해가 되지 않습니다.
VOID 형 포인터에 대한 형변환에 대해 좋은 답변 기다리겠습니다.
코드는 각각 첨부파일에 첨부했습니다.
ThreadAdderOne.cpp 중... DWORD cntOfThread= 0; CreateThread( NULL, 0, TheadProc, (LPVOID)cntOfThread, 0, &dwThreadID[cntOfThread] );
ThreadAdderTwo.cpp 중... DWORD paramThread[]= {1, 3, 4, 7, 8, 10}; CreateThread( NULL, 0, ThreadProc, (LPVOID)(¶mThread[2]), 0, &dwThreadID[1] );
HANDLE WINAPI CreateThread(
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in_opt LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId
);
첨부 | 파일 크기 |
---|---|
ThreadAdderOne.TXT | 1.53 KB |
ThreadAdderTwo.TXT | 1.33 KB |
첫번째 호출에서는
첫번째 호출에서는 단지 그 값만 사용하겠다는 의미이고
두번째 호출에서는 값을 참조로 사용하겠다는 의미고 사용하는것 같습니다.
첫번째와 두번째에서 ThreadProc는 각기 넘어온 파라메터를 다르게 사용하겠죠.
1.
2.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
CreateThread의 4번째
CreateThread의 4번째 인자는 void형 포인터인데
왜 궃이 함수의 인자를 초기화 할떄 타입캐스팅이 필요한가요 ?
void 형 포인터의 초기화 피연산자의 타입은 아무꺼나 해도 상관 없지 않나요 ?
어차피 void 형 포인터니깐 어떤 데이터 타입의 변수가 와도 타입캐스팅에 의해서 자유자재로 접근 가능하지 않습니까?
첫번쨰 호출에서 cntOfThread의 변수에 대해, (LPVOID)cntOfThread 대신 , &cntOfThread 를 초기화 인자로 주니깐 잘못된 값을 계산하던데요...
왜 이런 결과가 나오는 걸까요?
LPVOID는 2차원 포인터입니다.
그냥&cntOfThread로 하면 1차원 포인터이니 안되지 않을까요?
void *
LPVOID와 VOID는 다르죠... void *이 LPVOID입니다.
(LPVOID)cntOfThread가 뜻하는 것은 cntOfThread에 3이 담겨있다면 이 값이 LPVOID(void *)형의 값이 됩니다.
&cntOfThread는 cntOfThread가 담겨있는 메모리상의 변수의 주소를 말하는 거니 완전 다르지요.
댓글 달기