2014-01-12 95 views
0

我正在實現一個多線程程序,其中我正在等待myThread重新創建一個值。Casting void * long *

result = pthread_join(myThread, &retValue); 

其中myThread回報(void *)returnValue:我如下這樣做。我的程序給出了一個Segmentation Fault當我嘗試打印的返回值使用:

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

誰能告訴爲什麼發生這種情況,如何解決這一問題?

+0

沒有看到線程函數的代碼,我們只能猜測。我的猜測是你正在返回一個指向局部變量的指針,當函數返回時它會超出範圍。 – Barmar

+0

根據文檔,'pthread_join'的'value_ptr'參數被傳遞給'pthread_exit'的值填充。這意味着如果你不調用'pthread_exit'並且讓線程的入口點函數返回,那麼你不會得到一個值。你在使用'pthread_exit'嗎? – zneak

+0

不,我只是使用'return(void *)returnValue'。這是否會造成問題? – TheRookierLearner

回答

2

你已經混淆了返回類型。

在你的線程結束時,你從(long)投射到(void *)

return (void *) count ; 

回到主,你是鑄造(void *)(long *),然後試圖取消對它的引用。由於伯爵可能是一個很小的數字,因此將其視爲一個內存地址變得繁榮起來。把它當作(long)代替:

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

謝謝,這很有幫助! :) – TheRookierLearner