То, что вы пытаетесь использовать, это alloca
.Объект va_list
не может хранить переменные, вызов функции сохраняет их, и вы можете получить к ним доступ только через va_list.Эти переменные действительны только во время вызова и впоследствии перезаписываются.
ЭТО НЕ БУДЕТ РАБОТАТЬ:
va_list func(int dummy, ...)
{
va_list result;
va_start(result, dummy);
return result;
}
Чтобы выделить память в стеке, без необходимости записи переменных функций используйтеalloca
.Он работает более или менее как malloc
, но вам не нужно вызывать free
, он автоматически освобождает себя, когда вы покидаете область действия.
int * local = (int *) alloca(3 * sizeof(int));
local[0] = 10;
local[1] = 20;
local[2] = 30;
По сути, это то же самое, что писать
int local[3];
local[0] = 10;
local[1] = 20;
local[2] = 30;
Но с alloca
3 не обязательно быть константой.Опять же, вы можете использовать его только внутри охватывающей области, поэтому не возвращает его из функции.
, если вы хотите получить из va_list несколько типов в одном списке, подумайте о создании объединениякак это:
union variant
{
int i;
unsigned int u;
float f;
double d;
const char * s;
void * v;
};