2015-04-24 20 views
0

我尝试使用多线程来完成一个项目,但我不太熟悉void *以及如何使用它。 我有此功能的问题:解除引用'void *'指针并强制转换不起作用

void *find_way_out(void *tree) 
{ 
    int i; 
    t_tree *tmp; 
    t_tree **road; 
    int j; 
    int th_nbr; 

    th_nbr = tree->thread_nbr; 
    j  = 0; 
    road = xmalloc(sizeof(t_tree)); 
    i  = 0; 
    tmp  = (t_tree *)tree; 
    road[j] = tmp; 

    tmp->visited[th_nbr] = 1; 

    while (1) 
    { 
    while (tmp->leaf[i] != NULL) 
    { 
     printf("room : %s && room next %s\n", tmp->room, tmp->leaf[i]->room); 
     if (tmp->leaf[i]->visited[th_nbr] == 0) 
     { 
     road[++j]   = tmp; 
     tmp     = tmp->leaf[i]; 
     tmp->visited[th_nbr] = 1; 
     i     = -1; 
     printf("going to room-> %s\n", tmp->room); 
     } 

     if (tmp->type == END) 
     { 
     printf("find end...\n"); 
     pthread_exit(&j); 
     } 
     i++; 
    } 
     tmp = road[j]; 
     if (--j == -1) 
     pthread_exit(0); 
     i = 0; 
     printf("backing to room %s\n", tmp->room); 
    } 
    pthread_exit(0); 
} 

的错误是在行: th_nbr = tree->thread_nbr;

thread_nbr是我的结构树中的一个整数。

我编译时有这些错误:

sources/find_way.c:21:16: warning: dereferencing ‘void *’ pointer 
    th_nbr = tree->thread_nbr; 
       ^
sources/find_way.c:21:16: error: request for member ‘thread_nbr’ in something not a structure or union 

你有一个想法解决它? 谢谢。

+4

“......并且演员不工作” - 你的演员在哪里? – Mat

+0

指定void *树到适当的结构,然后尝试使用它。 –

+0

你正在泄漏'路'。 –

回答

1

您需要先施放。

void *find_way_out(void *p_tree) 
{ 
    int  i; 
    t_tree *tree = (t_tree*) p_tree; 
    t_tree *tmp; 
    t_tree **road; 
    int  j; 
    int  th_nbr; 

    th_nbr = tree->thread_nbr; 

注意:在这里,我将void指针重命名为p_tree

2

在你的情况下,在提领时,

th_nbr = tree->thread_nbr; 

treevoid *类型。

您需要

th_nbr = tmp->thread_nbr; //tree changed to tmp 

使移动

tmp = (t_tree *)tree; 

,在提领点,tmptree类型的指针。

0

取消引用void *第一,为tmp 然后再也没有引用tree,始终使用tmp

这个问题来自于尝试解引用void *,就好像它将 定义为指向t_tree结构的指针。

+0

为什么你将纯文本标记为代码?它不适用于这种用法,你知道...... –