2013-11-24 4 views
0

, поэтому я пытаюсь реализовать некоторую форму стека. Вот определение я есть в моем файле заголовка:Выделение памяти для структуры (стека)

struct tStack 
{ 
    int data; 
    struct tStack *dptr; 
}; 

Тогда я иметь функцию inicialize стека в другой файл, от того, что она называется:

int stack_init(struct tStack *top) 
{ 
    top = (struct tStack*)malloc(sizeof(struct tStack)); 
    if (top == NULL) 
    { 
     return E_INTERN; 
    } 
    top->data = '#'; 
    top->dptr = NULL; 
    return 0; 
} 

И я вызвать функцию инициализации в мой основной файл, как это:

struct tStack *top = NULL; 
int err = 0; 

err = stack_init(top); 

проблема заключается в том, что стек не получит inicialized и указатель на вершине по-прежнему пустым. Я думаю, что проблема находится где-то в прохождении указателей, потому что я плохо разбираюсь в указателях: D

+2

вы передаете в 'STRUCT tStack *' на 'stack_init'. это означает, что выделение, которое вы выполняете, присваивается только теневому параметру и не оказывает влияния со стороны – amdixon

ответ

0

Ваша функция stack_init делает копию указателя - локальной для функции stack_init, которая перестает существовать, как только stack_init заканчивается. На самом деле вершина не будет равна нулю в теле вашей функции stack_init.

Вы можете сделать это:

struct tStack { 
    int data; 
    struct tStack *dptr; 
}; 

int stack_init(struct tStack **top) { 
    *top = (struct tStack*)malloc(sizeof(struct tStack)); 
    if (top == NULL) 
    { 
     return ERR; 
    } 
    (*top)->data = '#'; 
    (*top)->dptr = NULL; 
    return 0; 
} 

int main() { 
    struct tStack *top = NULL; 
    int err = 0; 
    err = stack_init(&top); 
} 
Смежные вопросы