2013-04-07 3 views
0

Я работаю над созданием библиотеки потоков и по какой-то причине столкнулся с простой проблемой malloc, которую я не могу исправить прямо сейчас. Я уверен, что это просто, я просто пропустил его.Malloc Typedef Struct Problems

В моей main.c У меня есть следующий код:

//declare testSem 
tasem_t testSem; 


int main(int argc, char **argv){ 
    ta_libinit(); 

    //initialize testSem 
    ta_sem_init(&testSem, 5); 
    //wait test 
    ta_sem_wait(&testSem); 

соответствующий код в моей библиотеке резьбы следующим образом:

void ta_sem_init(tasem_t *sema, int value) 
{ 

    //malloc the semaphore struct 
    sema = malloc(sizeof(tasem_t)); 

    //error check 
    if(sema == NULL) 
    { 
     printf("could not malloc semaphore"); 
     exit(0); 
    } 

    //initialize with the given value 
    sema->val = value; 
    printf("SemaVal = %i\n", sema->val); 
} 

void ta_sem_wait(tasem_t *sema) 
{ 
    printf("SemaVal = %i\n", sema->val); 

    if(sema->val <= 0) 
    { 
     //not done yet 
     printf("SWAPPING\n"); 
    } 
    else 
    { 
     printf("SemaVal = %i\n", sema->val); 
     sema->val = sema->val + 1; 
    } 
} 

Вот структура из моего заголовка файла:

//struct to store each semas info 
typedef struct tasem_t_struct 
{ 
    //value 
    int val; 
     //Q* Queue 
     //int numThreads 


}tasem_t; 

выход я получаю от этого:

SemaVal = 5 SemaVal = 0 подкачка

Так, очевидно, я не mallocing мою правильно-структуру, как значение внутри теряется, когда я выхожу за рамки. Я знаю, что должен просто забыть что-то простое. Есть идеи?

+0

«Я уверен, что это просто, я просто пропустил это». - Может быть, или, может быть, это глубокое фундаментальное недоразумение. В конце концов, с точки зрения опытного (или даже не очень опытного) программиста C, очевидно, что 'ta_sem_init' теряет память и не имеет смысла. –

+0

@JimBalter Это была просто пропущенная ошибка. Я это понимаю и да, это абсолютно утечка памяти. – tknickman

+0

Наконец, чтобы повторить мою первую точку: присвоение значения 'malloc' параметру ** ** не является вопросом того, чтобы что-то игнорировать, это фундаментальное непонимание C и способ программирования в нем. –

ответ

3

Вы не можете решить, кто несет ответственность за выделение вашей структуры tasem_t. У вас есть глобальная переменная для этого и передайте свой адрес ta_sem_init. Но тогда у вас есть ta_sem_init динамически выделяет совершенно новую структуру tasem_t, сохраняя ее адрес до sema, локального аргумента функции, чтобы адрес терялся при выходе из области видимости.

Выберите один, либо:

  • Сделать ta_sem_init инициализировать существующуюtasem_t переменную.
  • Сделать ta_sem_init присвоить и инициализировать новыйtasem_t структуру, а затем вернуть ее адрес (either directly or via a tasem_t** output parameter).
+0

Да, все. Многим переменным во многих местах. Спасибо за помощь! – tknickman

+0

Такие ошибки не могут возникнуть, если люди следуют простой практике написания короткого описательного комментария для каждой функции перед кодированием функции ... либо // выделяет инициализированный tasem_t и возвращает указатель на него', либо '// принимает указатель на неинициализированный tasem_t и инициализирует его –