(LPVOID)형태의 타입캐스팅에 대하여...

superdma의 이미지

아래와 같은 코드에서 CreateThread함수의 4번째 인자를 넘길떄 생기는 타입캐스팅에 대해서 질문드립니다.
우선 아래와 같은 코드에서 각각 (LPVOID)cntOfThread,(LPVOID)(&paramThread[2])형태로 타입캐스팅을 하는데
굳이 저렇게 명시적으로 타입캐스팅을 하지 않아도 4번째 인자가 LPVOID 타입이기 떄문에 동작 상 문제가 없을 것 같던데,
결과 값이 다르게 나오더군요.

첫번쨰 코드는 cntOfThread가 DWORD 인데, 이를 (LPVOID)cntOfThread 해서 4번쨰 인자를 초기화 해서 접근 하는 것이 정확히 어떤것인지 잘 이해가 되지 않습니다.

두번쨰 코드는 (LPVOID)(&paramThread[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)(&paramThread[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
);

File attachments: 
첨부파일 크기
Plain text icon ThreadAdderOne.TXT1.53 KB
Plain text icon ThreadAdderTwo.TXT1.33 KB
IsExist의 이미지

첫번째 호출에서는 단지 그 값만 사용하겠다는 의미이고
두번째 호출에서는 값을 참조로 사용하겠다는 의미고 사용하는것 같습니다.

첫번째와 두번째에서 ThreadProc는 각기 넘어온 파라메터를 다르게 사용하겠죠.

1.

ThreadProc(LPVOID *ptr)
{
   DWORD cnt = (DWORD)ptr;
   ...
} 

2.

ThreadProc(LPVOID *ptr)
{
   DWORD cnt = *(DWORD *)ptr;
   ...
} 

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

superdma의 이미지

CreateThread의 4번째 인자는 void형 포인터인데
왜 궃이 함수의 인자를 초기화 할떄 타입캐스팅이 필요한가요 ?
void 형 포인터의 초기화 피연산자의 타입은 아무꺼나 해도 상관 없지 않나요 ?

어차피 void 형 포인터니깐 어떤 데이터 타입의 변수가 와도 타입캐스팅에 의해서 자유자재로 접근 가능하지 않습니까?
첫번쨰 호출에서 cntOfThread의 변수에 대해, (LPVOID)cntOfThread 대신 , &cntOfThread 를 초기화 인자로 주니깐 잘못된 값을 계산하던데요...
왜 이런 결과가 나오는 걸까요?

mg2000의 이미지

그냥&cntOfThread로 하면 1차원 포인터이니 안되지 않을까요?

pensaku의 이미지

LPVOID와 VOID는 다르죠... void *이 LPVOID입니다.

(LPVOID)cntOfThread가 뜻하는 것은 cntOfThread에 3이 담겨있다면 이 값이 LPVOID(void *)형의 값이 됩니다.

&cntOfThread는 cntOfThread가 담겨있는 메모리상의 변수의 주소를 말하는 거니 완전 다르지요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.