将类型转换指针传递给 pthread_join
passing a type casted pointer to pthread_join
我有一个任务,我在 C 中使用线程,并且与很多人一样,我遇到了由于 pthread_join
的第二个参数是 void**
类型导致的错误,然后在一些研究我弄清楚了类型转换是如何工作的。这是我正在谈论的示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
void *callback(void *arg){
sleep(2);
pthread_exit("done !!\n");
}
int main(){
pthread_t th;
void *val;
pthread_create(&th, NULL, callback, NULL);
pthread_join(th, &val);
printf("%s", (char*)val);
return EXIT_SUCCESS;
}
这按预期工作,但后来我很好奇并尝试声明一个 char *val
然后将其转换版本传递给 pthread_join
函数,如下所示:
int main(){
pthread_t th;
char *val;
pthread_create(&th, NULL, callback, NULL);
pthread_join(th, (void*)&val);
printf("%s", val);
return EXIT_SUCCESS;
}
这工作正常,但我不明白类型转换在此版本的代码中是如何工作的。谁能解释一下吗?
第一个密码正确,第二个密码错误。你会摆脱它,因为 char *
和 void *
的表示很可能是兼容的。
在 C 中强制转换的显式指针几乎总是说:"I am going to do some really dirty tricks, trust me, I know better than you, dear compiler, what I am doing"。只有 4 个例外情况是必须且正确的:
- 转换为字符指针或character/void指针返回原始
- 将指向结构的指针转换为指向初始成员类型的指针,反之亦然
- 将指针转换为以原始类型作为其成员的联合
- 将指向函数的指针转换为另一种函数指针类型
其他情况都是求鼻魔。强制转换的经验法则是:"the less the better".
此外,pthread_join
期望的类型是 void **
,而不是您的演员表生成的 void *
,但是作为通用指针的 void *
会被静默转换pthread_join
.
预期的 void **
我有一个任务,我在 C 中使用线程,并且与很多人一样,我遇到了由于 pthread_join
的第二个参数是 void**
类型导致的错误,然后在一些研究我弄清楚了类型转换是如何工作的。这是我正在谈论的示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
void *callback(void *arg){
sleep(2);
pthread_exit("done !!\n");
}
int main(){
pthread_t th;
void *val;
pthread_create(&th, NULL, callback, NULL);
pthread_join(th, &val);
printf("%s", (char*)val);
return EXIT_SUCCESS;
}
这按预期工作,但后来我很好奇并尝试声明一个 char *val
然后将其转换版本传递给 pthread_join
函数,如下所示:
int main(){
pthread_t th;
char *val;
pthread_create(&th, NULL, callback, NULL);
pthread_join(th, (void*)&val);
printf("%s", val);
return EXIT_SUCCESS;
}
这工作正常,但我不明白类型转换在此版本的代码中是如何工作的。谁能解释一下吗?
第一个密码正确,第二个密码错误。你会摆脱它,因为 char *
和 void *
的表示很可能是兼容的。
在 C 中强制转换的显式指针几乎总是说:"I am going to do some really dirty tricks, trust me, I know better than you, dear compiler, what I am doing"。只有 4 个例外情况是必须且正确的:
- 转换为字符指针或character/void指针返回原始
- 将指向结构的指针转换为指向初始成员类型的指针,反之亦然
- 将指针转换为以原始类型作为其成员的联合
- 将指向函数的指针转换为另一种函数指针类型
其他情况都是求鼻魔。强制转换的经验法则是:"the less the better".
此外,pthread_join
期望的类型是 void **
,而不是您的演员表生成的 void *
,但是作为通用指针的 void *
会被静默转换pthread_join
.
void **