@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, чего не произошло. Где тогда она находится?
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 2
dzolotarev
@dzolotarev
Этот мир крэшится - я собираю дампы
Стандарт и код стандартной библиотеки смотрели?
Они хранятся, как и любые аргументы функции, на стеке: https://stackoverflow.com/questions/12371450/how-a...
Ответ написан
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Пишу ОС (важно, не выйдет использовать 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.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
FunBox Томск
от 120 000 ₽
FunBox Екатеринбург
от 120 000 ₽
FunBox Санкт-Петербург
от 120 000 ₽
19 февр. 2020, в 04:53
2000 руб./за проект
19 февр. 2020, в 02:24
500 руб./за проект
18 февр. 2020, в 23:53
8000 руб./за проект