Cout выдает странный результат

#c #linux #output #cout

#c #linux #вывод #cout

Вопрос:

Это для моей лабораторной работы, которая заключается в создании простой очереди с использованием C .

 #include "Task5.h"
#include <iostream>
using namespace std;

void push(const long amp;i, node* amp;n) {
    if (n == NULL) {
        node *ptr = new node;
        ptr -> item = i;
        ptr -> next = NULL;
        n = ptr;
        cout << "Created New Node." << endl;
    }
    else {
        node *ptr = n;
        cout << "Created Pointer" << endl;
        while (ptr -> next != NULL){
            cout << "Finding Next..." << endl;
            ptr = ptr -> next;
        }
        cout << "I'm here." << endl;
        node *temp = new node;
        temp -> item = i;
        ptr -> next = temp;
        cout << "Node Created." << endl;
    }
}

long pop(node* amp;n) {
    if (n == NULL) cout << "HEY!!! Can't pop an empty queue." << endl;
    else {
        long val;
        node *ptr = n;
        n = n -> next;
        val = ptr -> item;
        delete ptr;
        return val;
    }
}

int main() {
    node *head = NULL;
    push(13,head);
    push(10,head);
    push(18,head);
    push(22,head);
    cout << pop(head) << endl;
    cout << pop(head) << endl;
    cout << pop(head) << endl;
    cout << pop(head) << endl;
    cout << pop(head) << endl;
    cout << pop(head) << endl;
}
  

Это дает следующий результат:

 Created New Node.
Created Pointer
I'm Here.
Node Created.
Created Pointer
Finding Next...
I'm here.
Node Created.
Created Pointer
Finding Next...
Finding Next...
I'm here.
Node Created.
13
10
18
22
HEY!!! Can't pop an empty queue.
6296192
HEY!!! Can't pop an empty queue.
6296192
  

Таким образом, конечным результатом является то, что код работает, ОДНАКО он выдает 6296192 случайным образом. Я подумал, может быть, я что-то неправильно написал или cout преобразует endl; в hex. Мой преподаватель лаборатории также понятия не имеет, что происходит. Может кто-нибудь сказать мне, что происходит? Если это поможет, я запускаю этот код через терминал запуска Linux.

Заранее спасибо.

Комментарии:

1. Вопрос: Какое значение возвращает pop () при попытке открыть пустую очередь?

2. Включите предупреждения вашего компилятора и / или перестаньте игнорировать предупреждение, которое сообщает вам что-то о том, что «не все пути управления возвращают значение» в вашей pop функции. Это было бы первым признаком того, что там что-то может быть не так. Я надеюсь, что «преподаватель лаборатории также понятия не имеет», на самом деле не соответствует действительности, и они знали , но хотели, чтобы вы нашли это самостоятельно. Если нет, возьмите почти все, что они вам дают, за то, чего это стоит (что, вероятно, будет не так много).

3. @NathanOliver в силу неразрешимости проблемы с остановкой, это так.

4. @Quentin Я удалил комментарий, поскольку понял, что здесь выдается только предупреждение. Я не думаю, что это связано с проблемой остановки, поскольку каждый проверяет, возвращаются ли все пути выхода.

5. @NathanOliver это было слишком сложно. Просто определение того, foo() { bar(); } должно ли вызывать предупреждение, требует знания того, bar останавливается ли.

Ответ №1:

В вашей функции:

 long pop(node* amp;n) {
  

вы ничего не возвращаете в случае, если n == NULL является true. Итак, это UB, и он также может вызывать такие случайные значения на выходе.

Комментарии:

1. Ах, это имеет смысл. Спасибо. Я знал, что это что-то глупое XD

Ответ №2:

Я бы предложил использовать отладчик с точкой останова в первом cout << pop(head) << endl; и каждый раз просматривать значение, возвращаемое из pop.

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

cout << pop(head) << endl; Использует значение, возвращаемое pop() , но в случае пустой очереди значение не возвращается, что приводит к неопределенному поведению.