2015-11-15 3 views
0

Я пытаюсь реализовать блокировку потока низкого уровня без использования динамического распределения памяти; этот код будет в основном использоваться на полностью голое ядро.Статическое выделение членов структуры внутри другой статической структуры?

Однако я сталкиваюсь с проблемой получения seg-ошибки, когда пытаюсь разыменовать элемент внутри этой глобальной статической структуры. Мой код как таковой

Моя обертка структура

/** LOCKING STRUCT & FUNCTIONS **/ 
struct lock { 
    int free; 
    struct thread_list* wait_list; 
    struct thread* current_holder; 
}; 

вложенная структура (предназначен как связанный список рода сделки)

struct thread_list { 
    struct thread *head; 

}; 

А член в этом списке

struct thread { 
    void *top; // top of the stack for this thread 
    void *sp; // current stack pointer for this thread (context) 
    void (*start_func)(void *); 
    void *arg; 
    int state; 
    int exit_value; 
    struct thread *join_thread; 
    struct thread *next_thread; 
    int id; 
}; 

Метод, который я пытаюсь реализовать, как таковой

void lock_init (struct lock *lk) { 
    lk->free = 1; //Set lock as free 
    struct thread_list waiting = lk->wait_list; //Get waitlist, works fine 
    waiting->head = NULL; //Set waitlist's head to null, SEGFAULTS HERE 
} 

Я не супер владею C, но я не могу понять правильную методологию/синтаксис, чтобы заставить мой код работать так.

+0

Эта строка: 'struct thread_list waiting = lk-> wait_list;' НЕ работает нормально. он устанавливает содержание структуры не указателя в указатель. Возможно, строка должна быть: 'struct thread_list * waitingPtr = lk-> wait_list;' или аналогичный – user3629249

ответ

1
struct thread_list waiting = lk->wait_list; //Get waitlist, works fine 
waiting->head = NULL; //Set waitlist's head to null, SEGFAULTS HERE 

waiting не является указателем структуры, а структурной переменной. Для доступа к членам использовать его нужно использовать . оператора -

waiting.head = NULL; 

Или использовать -> оператор объявит его как указатель структуры.

+0

Я переключил его на указатель структуры, который допускал компиляцию, но все же был прерван. Затем я попытался использовать «.». для ссылки, но это привело к ошибке «неправильного инициализатора». –

+0

понял это! проблема заключалась в том, что я объявлял его указателем в моей структуре верхнего уровня, но это заставляло компилятор не выделять пространство для него. удалил * с оригинала и работал отлично. –

+0

@WilliamChiang Если бы вы использовали указатель, то перед тем, как разыгрывать, он выделяет ему память, чтобы избежать ошибки. – ameyCU

Смежные вопросы