C 铸造空隙*至长*

C 铸造空隙*至长*,c,multithreading,pthreads,C,Multithreading,Pthreads,我正在实现一个多线程程序,其中我正在等待myThread重新生成一个值。我的做法如下: result = pthread_join(myThread, &retValue); 其中myThread返回一个(void*)返回值。当我尝试使用以下方法打印返回值时,我的程序会出现分段错误: printf("Returned Value: %lu", *(long *)retValue; 有人能告诉我为什么会发生这种情况,以及我该如何解决这个问题吗?您混淆了返回类型 在线程的末尾,您从(长)

我正在实现一个多线程程序,其中我正在等待
myThread
重新生成一个值。我的做法如下:

result = pthread_join(myThread, &retValue);
其中
myThread
返回一个
(void*)返回值
。当我尝试使用以下方法打印返回值时,我的程序会出现
分段错误

printf("Returned Value: %lu", *(long *)retValue;

有人能告诉我为什么会发生这种情况,以及我该如何解决这个问题吗?

您混淆了返回类型

在线程的末尾,您从
(长)
转换为
(空*)

回到main,您正在将
(void*)
转换为
(long*)
,然后尝试取消引用它。由于count可能是一个小数字,所以将其视为内存地址会出现问题。将其视为
(长)

printf("Returned value: %lu", (long) retValue) ;

没有看到线程函数的代码,我们只能猜测。我猜您返回的是一个指向局部变量的指针,该变量在函数返回时超出范围。根据文档,
pthread\u join
value\u ptr
参数填充了传递给
pthread\u exit
的值。这意味着如果不调用
pthread\u exit
,只让线程的入口点函数返回,就不会得到值。您使用的是
pthread\u exit
?不是。我只是使用
return(void*)returnValue
。这就是造成问题的原因吗?我搞错了,让线程结束并返回一个
void*
与调用
pthread\u exit
是一样的。好的,请确保您返回的指针在线程终止后有效(例如,不是线程本地存储,也不是堆栈内存)。@Barmar和@zneak-如果
returnValue
不是全局的,我会说这就是问题所在。但确实如此。谢谢,这很有帮助!:)
printf("Returned value: %lu", (long) retValue) ;