c - 将类型转换的指针传递给 pthread_join
问题描述
我有一个任务,我在 C 中使用线程,并且与很多人类似,我得到了由pthread_join
' 的第二个参数是 type引起的错误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 语言转换的显式指针几乎总是说:“我要做一些非常肮脏的把戏,相信我,亲爱的编译器,我比你更了解我在做什么”。只有 4 个例外情况是必须且正确的:
- 将字符指针或字符/空指针转换回原始指针
- 将指向结构的指针转换为指向初始成员类型的指针,反之亦然
- 将指针强制转换为具有原始类型作为其成员的联合
- 将指向函数的指针转换为另一个函数指针类型
所有其他情况都要求鼻恶魔。演员表的经验法则是:“越少越好”。
此外,预期的类型pthread_join
isvoid **
而不是void *
你的演员产生的类型,但是void *
作为一个泛型指针被默默地转换为void **
预期的pthread_join
.
推荐阅读
- python - 在 YahooEarningsCalendar 类中出现以下错误“IndexError: list index out of range”
- git - git rebase 说我只碰了5个文件就修改了380个文件
- javascript - Bot 不断在欢迎频道发送垃圾邮件
- typescript - 如何使用 WorkBox 禁用缓存服务人员
- google-drawings - Google 绘图 - 现在无法打开 .wmf 文件
- r - 三向列联表 gtsummary
- javascript - 如何显示从一个公共点开始的数据
- spring-boot - Springboot反序列化“>”符号为>和“<”为<
- youtube - Youtube-dl 仅选择主要发行艺术家和年份并添加自定义元数据
- javascript - Vue 3 - “无法解析组件”警告