2016-02-22 2 views
-1
struct Node { 
    int value; 
    Node *n; 
}; 

void push (Node *front, int value) { 
    Node new; 
    new.n = front; 
    new.value = value; 
    Node *newPtr = &new; 
    front = newPtr; 
} 

int pop (Node *front) { 
    int n = front->value; 
    front = front->n; 
    return n; 
} 

Я попытался реализовать стек без динамического распределения памяти таким образом, но я не смог заставить его работать. Любые намеки на то, что я должен делать, чтобы он работал?Реализация стека без динамического распределения памяти

+0

Необходимо указать [минимальный, полный и проверенный пример (MCVE)] (http://stackoverflow.com/help/mcve), а также описание того, что точно не сработало, включая точный текст сообщения об ошибке и где они появятся. – Drop

+0

@Drop Поскольку функция pop не работала (передний узел не исчезнет), я предположил, что сам дизайн был уже некорректным с самого начала. – Haxify

+0

Без MCVE мои догадки: (1) 'new' это зарезервированное ключевое слово в C++, вы не можете использовать его как имя идентификатора, (2) после' push() ',' front' указывает на временный объект, который разрушен когда 'push()' выходит – Drop

ответ

0

Вы берете адрес временной переменной. В push вы создаете локальную переменную «new», берете ее адрес, а затем, когда функция выходит, это недопустимый указатель.

Для решения этой задачи необходимо использовать динамическое распределение памяти, если ваше решение будет надежным.

+0

Название темы: «Реализация стека * без * распределения динамической памяти» – Drop

+0

Да .... но программа не соответствует этой задаче. Иногда ответ указывает, что вы не должны этого делать. (Опция должна была бы использовать другую структуру данных, фиксированный массив или что-то еще, но он явно имеет структуру связанных списков.) –

+0

Ну, стек * может * быть реализован без кучи. Надёжная. И ответ заключается в том, чтобы не использовать связанный список в качестве базовой структуры данных или использовать распределитель на основе стека. – Drop