Код в show()
в порядке, кроме
- все те броски, которые абсолютно бесполезны в C.
и тот факт, что pd
определяется глобально
struct DIRECCION * pd = NULL;
void* show(void* dm)
{
...
что не требуется. Определено pd
локально для show()
:
void* show(void* dm)
{
struct DIRECCION * pd = dm;
...
В main()
чистый способ получить значение указателя, возвращенное show()
, будет:
int main(void)
{
...
{
void * pv;
pthread_join(s_id, &pv);
/* Find the value inside pv here. */
}
Действуя как описано выше, есть две возможности продолжить работу со значением указателя, полученным для pthread_join()
:
Используйте значение указателя, как показано ниже:
int main(void)
{
struct DIRECCION * pd;
...
{
void * pv;
pthread_join(s_id, &pv);
pd = pv;
}
printf("Calle: %s\t", pd->street);
...
Размените значение указателя и скопируйте то, на что он указывает, в подходящую структуру (память, на которую он указывает, впоследствии не нужна, поэтому освободите ее, чтобы избежать утечки):
int main(void)
{
struct DIRECCION d;
...
{
void * pv;
pthread_join(s_id, &pv);
d = *((struct DIRECCION *) pv); /* The only cast necessary in fact. */
free(pv); /* This frees what has been allocated in `show()`. */
}
printf("Calle: %s\t", d.street);
...
Обратите внимание, что pthread_join()
может завершиться ошибкой, поэтому настоятельно рекомендуется проверить значение, которое оно возвращает для ошибки.
Если pthread_join()
преуспел, значение указателя, которое он возвращает, может все еще быть NULL
, таким образом, проверка это важно перед разыменованием значения указателя.
Таким образом, безопасный способ (попытка) получить значение указателя из pthread_join()
было бы:
int main(void)
{
...
{
void * pv;
int result = pthread_join(s_id, &pv);
if (0 != result)
{
fprintf("pthread_join() failed: %s\n", strerror(result));
exit(EXIT_FAILURE); /* EXIT_x come with stdlib.h. */
}
if (NULL == pv)
{
/* Handle this case here or exit() as well. */
}
else
{
/* Use the value inside pv here. */
}
}