2015-04-25 3 views
2

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

/* incomplete type */ 
typedef struct stack_t *stack; 

/* create a new stack, have to call this first */ 
stack new_stack(void); 

А вот моя структура стека и new_stack функция:

struct stack_t { 
    int count; 
    struct node_t { 
      void *data; 
      struct node_t *next; 
    } *head; 
}; 

stack new_stack(void) 
{ 
    struct stack_t new; 
    new.count = 0; 
    new.head->next = NULL; 
    return new; 
} 

В моих глазах, я возвращаю адрес нового стека, но это бросает ошибку на компиляции от возвращения нового. Что я делаю не так?

+0

Ошибка компиляции сообщает вам. Что это? Мы можем помочь вам в том, как читать. – Hurkyl

+0

@Hurkyl error: возвращает 'struct stack_t' из функции с несовместимый тип результата 'stack' (aka 'struct stack_t *'); взять адрес с & возврата &new; – Connor

+0

@Hurkyl но когда я вернуться и новый вместо этого, я получаю предупреждение: адрес стековой памяти, связанный с локальной переменной «новый» вернулся – Connor

ответ

3

Вы возвращаете stack_t в качестве значения, но возвращаемый тип функции stack_new - stack, что составляет typedef struct stack_t* stack.
Вам нужно вернуть указатель - изменить распределение stack_t из стека в кучу с помощью malloc для динамического выделения.
Не забывайте, что стек больше не нужен, поскольку он теперь динамически распределяется.

stack new_stack(void) 
{ 
    struct stack_t* new = malloc(sizeof(struct stack_t)); 
    new->count = 0; 
    new->head = NULL; 
    return new; 
} 
+2

Возврат 'struct_t' будет противоречить предпосылке вопроса, который заключается в том, что' struct_t' является непрозрачным типом. – Jon

+0

@jon: да, вы правы, изменили ответ – Krab

+3

'new-> head- > next = NULL; 'должно быть' new-> head = NULL; ' – BLUEPIXY

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