2013-09-08 1 views
0

У меня есть 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», который появляется внутри библиотечной функции является неправильно. Почему переданное значение разыменовывается таким же образом, что отличается от функции вызова и отличается в вызываемой функции?

+0

Вы передаете указатель на указатель ('void **'), но функция принимает указатель ('void *'). (править: на самом деле, может быть, нет. Все еще пытаюсь понять ваш код ...) – Dave

+0

Правильно, вы делаете 'void *' в 'void **', вместо того, чтобы указывать на него указатель. Вы должны сделать 't = & t1' и' arg_thread = & thread; '. С вашим текущим кодом вы переключаете типы указателей повсюду и делаете беспорядок в памяти. – Dave

+0

Прошлое значение, то есть функция f0, верна. Однако он неправильно печатает в функции MyThreadJoin. – user2759617

ответ

0

Можете ли вы добавить код для печати адреса памяти arg_thread и t. У меня есть чувство, что происходит, так это то, что ваш указатель нарезается пополам броском. Правильно ли объявлен MyThreadJoin в MyLib.h? Вы компилируете свой код как 64 бит?

Я только что видел ваш комментарий, где вы создавали t. Похоже, вы выделяете его в стек (не кучу). Когда вы поднимаете стек стека, его память не была перезаписана. Когда вы вставляете новую функцию в стек, она перезаписывает память на t. Простым решением является malloc struct в вашей функции построения.

+0

Я пробовал печатать адреса обоих, и адрес подходит как для обоих, так и для f0 и arg_thread в функции MyThreadJoin. Да, я компилирую на 64-битной машине. – user2759617

+0

Спасибо. То, что вы говорите, имеет большой смысл. Я проиндексировал, что при нескольких вызовах MyThreadCreate, а затем в MyThreadJoin значение, которое я получаю, остается неизменным. Не могли бы вы объяснить, может быть, короткий код, как я должен исправить эту проблему? – user2759617