2014-01-12 2 views
0

Я реализую многопоточную программу, в которой я жду myThread, чтобы вернуть значение. Я делаю это следующим образом:Кастинг void * to long *

result = pthread_join(myThread, &retValue); 

где myThread возвращает (void *)returnValue. Моя программа дает Segmentation Fault, когда я пытаюсь напечатать возвращаемое значение с помощью:

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

Может кто-нибудь сказать, почему это происходит и как это исправить?

+0

Не видя код функции потока, мы можем только догадываться. Я предполагаю, что вы возвращаете указатель на локальную переменную, которая выходит из области действия при возврате функции. – Barmar

+0

В соответствии с документом параметр 'value_ptr'' pthread_join' заполняется значением, переданным '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

Смежные вопросы