#include <pthread.h>
#include "../header/tlpi_hdr.h"
static void *
threadFunc(void *arg)
{
char *s = (char *) arg;
printf("%s", s);
return (void *) strlen(s);
}
int
main(int argc, char *argv[])
{
pthread_t t1;
void *res;
int s;
s = pthread_create(&t1, NULL, threadFunc, "Hello world\n");
if (s != 0)
errExitEN(s, "pthread_create");
printf("Message from main()\n");
s = pthread_join(t1, &res);
if (s != 0)
errExitEN(s, "pthread_join");
printf("Thread returned %ld\n", (long) res);
exit(EXIT_SUCCESS);
}
위의 코드는 지금 내가 공부하고있는 것일 뿐이지 만 데이터 형식의 변환에 대해서는 이해할 수 없습니다.C에서 데이터 형식 변환
threadFunc()
에서 반환 유형은 void *
입니다. 그러나이 함수에서 strlen(s)
은 size_t
입니다. 그러나 이것이 어떻게 (void *)
으로 바뀔 수 있는지. 내 말은, 왜 안돼 (void *) &strlen(s)
?
그리고 또한 main()
에는 printf("Thread returned %ld\n", (long) res);
가 있습니다.
변수 res
은 (void *)
이고 int
또는 long
이 아닙니다. 따라서 다음과 같이 변경해야합니다.
(long) *res
.
그러나 어떻게 이것을 (long) res
으로 변경할 수 있습니까?
* "왜 (공백 *) & strlen (s)"*은 컴파일되지도 않고 (아무리 의미가 없어도) * 실용적이라고 분명히 판명 할 수 있습니다. 짧은 대답 : 필자는 본질적으로 포인터가 아닌 값을 포인터에 넣고 "적합"할 것이라는 희망을 가지고 있습니다. 이를 수행하는 올바른 방법은 [''intptr_t'] (http://en.cppreference.com/w/c/types/integer) 값을 사용하는 것입니다. 그러나 분명히 그들은 정확성을 찾고 있지 않았습니다. – WhozCraig
캐스트는 "내가 말하는대로해라. 내가하고있는 것을 안다"라고 말한다. 자신이하는 일을 모를 경우 위험합니다. 그것은 또한 "strlen()에 의해 반환 된 값을 마치'void *'처럼 처리합니다. - 값이 적당한 크기인지 확인하십시오 (일반적으로 이미 있습니다). 사용 된 기술은 합리적인 가정하에 작동하지만 거의 우아하지 않습니다. 나는 그것이 '정의되지 않은 행동'에 관해서 얇은 얼음을 밟고있는 것을 발견하는 것에 놀라지 않을 것이다. 그러나 나는 문제의 근원에 즉시 손가락을 집어 넣을 수 없다. –
스레드 함수에서 임의의 값을 반환하는 방법을 묻는 중입니까? – 2501