Как точно работает процесс раскрутки стека вызовов для вызовов функций? - C ++ - PullRequest
0 голосов
/ 12 февраля 2020

Я решаю проблему TowerOfHanoi, используя стеки в STL (C ++). Но я не уверен, почему я получаю это предупреждение в строке 6703:

Warning C26444

Когда я получаю это предупреждение, я не получаю ожидаемый результат при запуске программы. Программа не показывает вывод в окне консоли, а в окне консоли просто говорится: «Нажмите любую клавишу, чтобы продолжить ...»

Но, когда я помещаю инструкцию возврата перед строкой 6703, предупреждение исчезает и я получаю правильный результат в окне консоли вывода:

Appending return, solves the issue

И, следующий, вывод на консоль, когда я добавляю return перед вызовом функции (в строке 6703) -

Correct output, when I append return in front of the function

Почему я должен добавить return перед вызовом функции, для чтобы он работал правильно?

Если мы посмотрим на стек вызовов, то будет создано три стека вызовов: 1. Один для основного 2. Второй для towerOfHanoi(stack1,stack2,stack3, 3) 3. Третий для towerOfHanoi(stack1,stack2,stack3, 2)

После этого начинается процесс разматывания стека - 3. towerOfHanoi(stack1,stack2,stack3, 2) возвращает stack3 в towerOfHanoi(stack1,stack2,stack3, 3) 2. Теперь towerOfHanoi(stack1,stack2,stack3, 3) в свою очередь возвращает stack3 в main()

Правильно ли я понимаю, как стек процесс раскручивания продолжается? И возвращение важно в строке 6703: return towerOfHanoi(stack1, stack2, stack3, n - 1) - потому что, если оно отсутствует, мы не сможем вернуть stack3 к main? -

StackFrame unwinding process

Не могли бы вы объяснить, как лучше раскрутить кадр стека?

1 Ответ

2 голосов
/ 12 февраля 2020

towerOfHanoi (stack1, stack2, stack3, 2) возвращает stack3 в towerOfHanoi (stack1, stack2, stack3, 3) из-за

if (n == 2) {
    return stack3;
}

, но

towerOfHanoi (stack1, stack2, stack3, 3) ничего не возвращает main. Потому что вы не предоставили оператор возврата в конечной функции.

...