【发布时间】:2016-09-17 15:52:29
【问题描述】:
我在尝试访问 pthread_join 的第四个参数时遇到了分段错误。这是我的代码:
void* threadHandler(void* arg)
{
printf("arg: %c\n", *(char *) arg);
pthread_exit(0);
}
int main()
{
pthread_t threadA;
pthread_create(&threadA, NULL, threadHandler, "N");
void *retval;
pthread_join(threadA, &retval);
printf("retval: %d\n", *(int *) retval);
return 0;
}
知道为什么最后一个 printf 会导致分段错误吗?我如何解决它? (我的理解是retval应该包含threadHandler的返回值,所以在这种情况下应该是0吧?)
提前致谢!
【问题讨论】:
-
pthread_exit将指向 void 的指针作为返回值。您正在返回(void *)0,它是一个空指针。然后你取消引用空指针,这会导致未定义的行为(在这种情况下崩溃)。 -
-
首先,你说
threadHandler()的返回值,但它没有返回任何会调用未定义行为的东西。最重要的是,您应该返回一个指针,而0可能是NULL指针。然后你取消引用它在理论上调用 UB 并最终导致崩溃。 -
facepalm 谢谢大家:)
标签: c segmentation-fault pthreads