【问题标题】:Dereferencing ‘void *’ pointer and cast doesn't work取消引用“void *”指针和强制转换不起作用
【发布时间】:2015-07-03 08:50:43
【问题描述】:

我尝试使用多线程做一个项目,但我对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* 树类型转换为适当的结构,然后尝试使用它。
  • 你在泄露road

标签: c pointers casting void dereference


【解决方案1】:

在您的情况下,在取消引用时,

 th_nbr = tree->thread_nbr;

tree 的类型为 void *

你需要移动

 tmp = (t_tree *)tree;

之前

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

因此,在取消引用时,tmp 应该是 tree 类型的指针。

【讨论】:

    【解决方案2】:

    您需要先投射。

    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

    【讨论】:

      【解决方案3】:

      首先取消引用void *,进入tmp 然后永远不要再引用tree,始终使用tmp

      问题来自于尝试取消引用 void *,就好像它 被定义为指向t_tree 结构的指针。

      【讨论】:

      • 为什么将纯文本标记为代码?它不适合这种用途,你知道...
      猜你喜欢
      • 2015-10-05
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      相关资源
      最近更新 更多