在C中取消引用struct void指针

时间:2013-09-08 20:20:45

标签: c pointers void-pointers

我有一个MyLib.h

typedef void *MyThread;

和MyLib.c,其中包含:

typedef struct
{
ucontext_t *context;
int tid;
}_MyThread;

有一个测试函数可以创建一个线程并发出一个连接:

void f0(void * dummy)
{
  MyThread t1;
  printf("f0 start\n");
  t1 = MyThreadCreate(f1, NULL);
  _MyThread *t = (_MyThread*)t1;
  printf("passed value=%d\n",t->tid);

  printf("f0 join on t1\n");
  MyThreadJoin(t1);
....
}

MyLib.c中的MyThreadCreate和MyThreadJoin如下:

MyThread MyThreadCreate(void(*start_funct)(void *), void *args)
{
   _MyThread child_thread; 
   ... 
   //setting the child thread's tid 
   child_thread.tid = ++active_threads;
   ... MyThread ret = (MyThread)&child_thread;
   return ret;
}

int MyThreadJoin(MyThread thread)
{
    _MyThread *arg_thread;
    arg_thread = (_MyThread*)thread;
    int id = arg_thread->tid;
....
}

我的问题是,当我运行上述内容时,我得到:

passed value=2
f0 join on t1
arg_thread->tid = 13

传递的值=“2”是正确的,但是库函数中出现的值“13”是错误的。为什么传递的值以与调用函数不同的方式解除引用,在调用函数中不同?

1 个答案:

答案 0 :(得分:0)

可以添加代码来打印出arg_thread和t的内存地址。我有一种感觉,你的指针是由一个演员被切成两半。 MyThreadJoin是否在MyLib.h中正确声明了?您是否将代码编译为64位?

[编辑] 我刚看到你的评论你在哪里创建。它看起来像是在堆栈上分配它(而不是堆)。当你上堆栈帧时,它的内存没有被覆盖。当您将新函数推送到堆栈时,它会覆盖t上的内存。简单的解决方案是在构造函数中malloc结构。