取消引用“void *”指针和强制转换不起作用
Dereferencing ‘void *’ pointer and cast doesn't work
我尝试使用多线程做一个项目,但我对 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
你有修复它的想法吗?
谢谢。
您需要先投射。
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
.
在你的例子中,在解除引用时,
th_nbr = tree->thread_nbr;
tree
是 void *
类型。
你需要搬家
tmp = (t_tree *)tree;
之前
th_nbr = tmp->thread_nbr; //tree changed to tmp
因此,在取消引用时,tmp
应该是 tree
.
类型的指针
首先取消引用 void *
,进入 tmp
然后永远不要再引用 tree
,总是使用 tmp
.
问题是由于试图取消引用 void *
就好像
被定义为指向 t_tree
结构的指针。
我尝试使用多线程做一个项目,但我对 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
你有修复它的想法吗? 谢谢。
您需要先投射。
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
.
在你的例子中,在解除引用时,
th_nbr = tree->thread_nbr;
tree
是 void *
类型。
你需要搬家
tmp = (t_tree *)tree;
之前
th_nbr = tmp->thread_nbr; //tree changed to tmp
因此,在取消引用时,tmp
应该是 tree
.
首先取消引用 void *
,进入 tmp
然后永远不要再引用 tree
,总是使用 tmp
.
问题是由于试图取消引用 void *
就好像
被定义为指向 t_tree
结构的指针。