@sttie

Как в памяти располагаются аргументы функции с переменным количеством параметров?

Пишу ОС (важно, не выйдет использовать stdarg), возникла необходимость в функции с переменным количеством параметров. Такая функция (суммирование n чисел):

int test(int n, ...)
{
	int result = 0;

	for (int* ptr = &n; n > 0; n--)
	{
		ptr++;
		result += *ptr;
	}

	return result;
}


работает. А если вызывать такую функцию (с аргументами "test", 'q'):

void test(char* format, ...)
{
    char* ptr = format;

    for (int i = -10; i < 10; i++)
    {
        putc(*(ptr+i));
    }
}


то функция выведет:5e396f7a8be4e262436588.png
Ожидания были таковы, что хотя бы где-то должна была появиться буква q, чего не произошло. Где тогда она находится?
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Пишу ОС (важно, не выйдет использовать stdarg)

Остановись на этом месте и почитай про __builtin_va_list, __builtin_va_start, __builtin_va_arg и __builtin_va_end.
Поскольку компилятор знает ABI функций с переменным числом аргументов, он так же знает, как с ними обращаться.

А если вызывать такую функцию (с аргументами "test", 'q'):

void test(char* format, ...)
{
    char* ptr = format;

    for (int i = -10; i < 10; i++)
    {
        putc(*(ptr+i));
    }
}


Ожидания были таковы, что хотя бы где-то должна была появиться буква q, чего не произошло.


Ты просто искал не в том месте: вместо того чтобы двигаться по стеку ты двигался по памяти вокруг первого параметра.
Вот так нашёл бы...:
void test(char* format, ...)
{
    char *ptr = (char *)&format;

    for (int i = -10; i < 10; i++)
    {
        putc(*(ptr+i));
    }
}

...если бы аргументы действительно всегда были на стеке. Но это не всегда так -- всё зависит от используемого ABI.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы