我有一个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”是错误的。为什么传递的值以与调用函数不同的方式解除引用,在调用函数中不同?
答案 0 :(得分:0)
可以添加代码来打印出arg_thread和t的内存地址。我有一种感觉,你的指针是由一个演员被切成两半。 MyThreadJoin是否在MyLib.h中正确声明了?您是否将代码编译为64位?
[编辑] 我刚看到你的评论你在哪里创建。它看起来像是在堆栈上分配它(而不是堆)。当你上堆栈帧时,它的内存没有被覆盖。当您将新函数推送到堆栈时,它会覆盖t上的内存。简单的解决方案是在构造函数中malloc结构。