Если у компилятора нет конкретной информации о том, как должен передаваться аргумент, например, когда нет прототипа или для аргументов, которые передаются, когда у прототипа есть многоточие ('...'), компилятор следует определеннымправила передачи аргументов.Эти правила в основном следуют тому, что происходило в предстандартном (или K & R) C - до того, как были использованы прототипы.Перефразировано из C99 6.5.2.2/6 «Вызовы функций»:
* the integer promotions are applied
* if the argument has float type it's promoted to double
После применения этих продвижений аргументов по умолчанию аргумент просто копируется туда, куда компилятор обычно копирует аргументы (как правило, в стек).Таким образом, аргумент struct будет скопирован в стек.
Если фактическая реализация функции не соответствует тому, как компилятор создает параметры, то вы получите неопределенное поведение (за исключением несоответствия со знаком или без знака, если значение можетбыть представленными или указатели на char и указатели на void могут быть смешаны / сопоставлены).
Также в C90, если функция неявно объявлена (что C99 не разрешает, хотя она разрешает функции без прототипов),возвращаемое значение по умолчанию равно int
.Еще раз, фактическая функция возвращает что-то еще, неопределенные результаты поведения.