Цитата из второго абзаца раздела BUGS
со страницы руководства alloca(3)
Во многих системах
alloca()
нельзя использовать внутри списка аргументов вызова функции, потому что пространство стека, зарезервированноеalloca()
, появится в стеке в середине пространства для аргументов функции.
Мне не удалось увидеть, как это произойдет. В качестве примера возьмем следующий код:
void f(int a, void * b, int c);
int
main(void)
{
f(1, alloca(100), 2);
}
Насколько я понимаю, alloca
расширяет кадр стека для main
вниз на 100 байт (путем изменения регистра указателя стека), затем указатель на этот блок памяти стека (вместе с 2 int
s) передается в кадр стека для f
. Таким образом, выделенное пространство не должно быть в середине a
, b
или c
, на самом деле оно должно быть в другом кадре (который в данном случае находится в кадре для main
).
Так в чем тут недоразумение?