Невозможно создать стек с правильным узлом - PullRequest
0 голосов
/ 23 января 2019

Это начальная часть основной функции, которую я использовал:

int main() {
int q;
struct ListNode* S = NULL;
scanf("%d\n",&q);
int i;
for (i=0;i<q;i++){
    int queryType;
    scanf("%d", &queryType);
    struct NumOp* j;
    struct NumOp k;
    if(queryType == 1){
        double num;
        scanf("%lf", &num);
        if(num>=1 && num<=100){
            k.type='n';
            k.num=num;
            k.op='\0';
            j=&k;
            Push(&S,j);
        }
    }

Теперь проблема в том, что это создаст стек, состоящий из последнего выдвинутого элемента во всех узлах, сдвинутых к этому времени. После внесения определенных изменений следующий код, похоже, работал нормально. Кто-нибудь может сказать мне, почему это не сработало?

int main() {
int q;
struct ListNode* S = NULL;
scanf("%d\n",&q);
int i;
for (i=0;i<q;i++){
    int queryType;
    scanf("%d", &queryType);
    struct NumOp* j = (struct NumOp*) malloc(sizeof(struct NumOp));
    if(queryType == 1){
        double num;
        scanf("%lf", &num);
        if(num>=1 && num<=100){
            j->type='n';
            j->num=num;
            j->op='\0';
            Push(&S,j);
        }

Объяснение - то, что я ищу.

1 Ответ

0 голосов
/ 23 января 2019

В первом варианте вы определяете k локально внутри цикла.Это означает, что он действительно выйдет из области видимости и завершит свое время жизни на каждой итерации цикла .Указатель на эту переменную станет недействительным на каждой итерации, а также по окончании цикла.

По той причине, что все элементы кажутся одинаковыми, это потому, что все элементы являются так же, как все указатели в стеке будут на один экземпляр k.Но, как уже отмечалось, эти указатели (которые все одинаковы) немедленно станут недействительными, и разыменование их приведет к неопределенному поведению .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...