У меня должно быть другое определение «error» :-) Что будет напечатано в первые два раза, когда вы вызываете свою функцию f
? Я получаю
1 -1216175936 134513787
1 2 134513787
1 2 3
для моих трех вызовов функций.
То, что вы видите, - это сдерживание с самых ранних дней C, когда люди играли без присмотра и без присмотра со своими функциональными вызовами.
Все, что происходит, это то, что вы вызываете функцию f
и печатаете три значения из стека (да, даже если вы только даете один или два). Что происходит, когда вы не предоставляете достаточно, так это то, что ваша программа, скорее всего, просто будет использовать то, что было в любом случае, что обычно приводит к проблемам с данными при чтении и катастрофическом сбое при записи.
Это совершенно компилируемое, хотя и очень неразумно C. И я имею в виду, что в очень реальном «неопределенном поведении» смысл слова (обращаясь конкретно к C99: «Если выражение, которое обозначает вызываемую функцию, имеет тип, который не включает прототип, ... если количество аргументов не равно числу параметров, поведение не определено »).
Вы действительно должны обеспечить полностью сформированные прототипы функций, таких как:
void f(int,int,int);
, чтобы гарантировать, что Ваш компилятор поднимает эту проблему, и использовать эллипсы (...
) в переменных функций параметров.
Как и в сторону, что обычно происходит под одеялом, что функция вызова начинается со стеком как:
12345678
11111111
и толкает (к примеру) два значения в стек, так что в конце концов, как:
12345678
11111111
2
1
Когда вызываемая функция использует первые три значения в стеке (так как это то, что он хочет), он приходит к выводу, что она имеет 1
, 2
и 11111111
.
Он выполняет то, что ему нужно сделать, а затем возвращает, а вызывающая функция очищает эти два значения от стека (это называется стратегией, вызывающей хороший вызов). Горе всем, кто пытается это сделать с помощью стратегии-призыв-хорошей стратегии :-), хотя это довольно необычно в C, поскольку он делает переменные функции аргументов, такие как printf
, немного сложнее сделать.
, что вы делаете это черный C магии ;-) , какой компилятор вы используете для составления этого? – Vanya
Похоже, вы принесли C# 4.0 на C. –
Эта программа * не работает. Если это «отлично работает» в вашем случае, у вас, вероятно, есть довольно неортодоксальная идея «нормально работать». – AnT