Что не так с моей реализацией стека? - PullRequest
2 голосов
/ 15 февраля 2012

Я создал реализацию стека в C. Вот соответствующие определения / методы, я удалил всю проверку / перераспределение ошибок, поэтому не комментируйте это:

typedef struct {
    Element *data;
    int top;
    int size;
} Stack;

typedef void* Element;

void push(Stack *s, Element e) {
    s->data[(s->top)++] = e;
}

Теперь в другом методе у меня есть цикл, в котором я вызываю push(). Что-то вроде

int character;
Stack *s = createStack();
while((character = getchar()) != EOF) {
    int tmp = character;
    push(s, &tmp);  
}

Однако, это не работает так, как я хочу. Стек каждый раз получает один и тот же адрес, поэтому, когда каждый символ читается, «содержимое» всего стека изменяется. Как мне изменить это, чтобы сделать то, что я хочу. например, когда читается abcde, стек выглядит (сверху вниз) e,d,c,b,a.

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012
int tmp = character;
push(s, &tmp);

Там вы передаете адрес локальной переменной tmp функции push, которая хранит указатель внутри себя. Каждый раз, когда цикл повторяется, переменная уничтожается и создается другая локальная переменная (скорее всего, поверх старой переменной), поэтому вы сохраняете указатели на уничтоженные переменные.

Если вы хотите, чтобы ваш стек был универсальным и работать с void*, вам нужно убедиться, что время жизни сохраняемых вами объектов больше, чем время жизни стека. Один из способов сделать это - выделить переменные в куче:

char* c = malloc(sizeof(char)); // or malloc(1) but sizeof is there in case you
                                // change the type later
*c = character;
push(s, c);

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

0 голосов
/ 15 февраля 2012

В качестве дополнения к вышеуказанному ответу:

Вы можете просто привести ваше значение типа int к указателю:

push(s, (int *) tmp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...