Вызов этой функции не приведет к «переполнению стека». Вы можете вызвать переполнение стека только рекурсивно вызывающей функцией. Я кратко объясню:
Когда вы вызываете функцию в программе, она создает новую запись в «стеке вызовов». Он содержит небольшую информацию о текущей функции, месте, откуда она была вызвана, и локальных переменных функции. Эта запись, как я уже сказал, создается при вызове функции, но когда вы возвращаетесь из функции, генерируете исключение или просто позволяете функции достичь своего конца, система использует эту информацию для возврата к предыдущей точке выполнения, затем удаляет эту запись из стека вызовов.
Итак, перед вызовом вашей функции у вас может быть в стеке:
. .
. .
. .
| |
+---------------------------+
| performComplexOperation() |
| return address |
| local variables |
| ... |
+---------------------------+
Затем вы вызываете функцию LogString
:
. .
. .
. .
| |
+---------------------------+
| performComplexOperation() |
| return address |
| local variables |
| ... |
+---------------------------+
| LogString() |
| return address |
| local variables |
| ... |
+---------------------------+
Но после завершения LogString
код вернется к performComplexOperation
с использованием обратного адреса. Запись для LogString будет удалена:
. .
. .
. .
| |
+---------------------------+
| performComplexOperation() |
| return address |
| local variables |
| ... |
+---------------------------+
(this is where
LogString used to be)
При переполнении стека пространство, занимаемое записями в стеке, превысит пространство, выделенное для стека языком, который вы используете *, и программа не сможет создать запись для функции, которую вы собираешься позвонить.
* Не совсем, но достаточно близко.