откуда компьютер знает, сколько аргументов будет использовано? - PullRequest
0 голосов
/ 30 марта 2011

откуда компьютер знает, сколько аргументов будет использовано?

мы помещаем аргументы в обратном порядке

, потому что есть функция printf

, которая принимает неопределенное числоаргументов.

в случае pritnf, компьютер может знать, сколько аргументов будет использовано.

если строка формата содержит "% s, привет, добро пожаловать в% s", тогда просто прочитайте 2больше аргументов.

но как компьютер может знать, когда дело доходит до

такой функции, прототип которой выглядит как

int func (int a, int b, ...)?

Может кто-нибудь объяснить мне на уровне сборки?

спасибо

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Это не так. Вы можете printf("%d"), он просто напечатает все, что найдет в стеке. Вы (программист) должны знать, сколько аргументов требуется функции как при ее вызове, так и при написании. Если вы не уверены, вы можете написать функции, которые имеют в качестве первого аргумента номер других аргументов.
На уровне сборки ничего не меняется. Параметры всегда располагаются перед ebp (они были переданы раньше, но их адрес выше, чем ebp, поэтому в некотором смысле они идут после него), начиная с ebp + 8 (первый аргумент). Если каким-то образом вы знаете, что ваш int func(int a, int b, ...) принимает 43 параметра, вы найдете их от ebp + 8 до ebp + 0x160 (при условии, что они все int с) (0x160 = 352dec = 8 + 43 * 4).
Конечно, неправильное количество параметров может привести к сбою вашей программы или странному поведению (например, printf("%s"))

1 голос
/ 30 марта 2011

Ответ - нет.Стандарт ANSI C89, на котором основано большинство компиляторов, не определяет какой-либо метод для определения того, какие типы аргументов указаны.printf () работает, потому что он имеет строку формата, которая точно указывает, какие аргументы и их типы указаны.Вы должны как-то знать, что передается, и использовать макросы va_ * из stdarg.h соответственно.В разделе 4.8 проекта стандарта ANSI C89 просто говорится, что поведение не определено, если вы запрашиваете неверный тип или неверное количество аргументов из того, что было фактически передано.

Прочтите это для подробностей из проекта ANSI C89:http://flash -gordon.me.uk / ansi.c.txt

...