У меня есть MyLib.h, который имеетРазыменования STRUCT недействительный указатель в C
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);
....
}
MyThreadCreate и MyThreadJoin в MyLib.c являются следующие:
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», который появляется внутри библиотечной функции является неправильно. Почему переданное значение разыменовывается таким же образом, что отличается от функции вызова и отличается в вызываемой функции?
Вы передаете указатель на указатель ('void **'), но функция принимает указатель ('void *'). (править: на самом деле, может быть, нет. Все еще пытаюсь понять ваш код ...) – Dave
Правильно, вы делаете 'void *' в 'void **', вместо того, чтобы указывать на него указатель. Вы должны сделать 't = & t1' и' arg_thread = & thread; '. С вашим текущим кодом вы переключаете типы указателей повсюду и делаете беспорядок в памяти. – Dave
Прошлое значение, то есть функция f0, верна. Однако он неправильно печатает в функции MyThreadJoin. – user2759617