(GNU) C 提供了至少两种在堆栈上操作可变数据的机制——第一种是alloca
函数及其相关项(例如strdupa
),第二种是“可变长度数组”功能。
问题alloca
在于它似乎没有在内存中分配连续区域 - 程序
#include <alloca.h>
#include <stdio.h>
int main(void) {
int *a = alloca(sizeof(int));
int *b = alloca(sizeof(int));
printf("b-a = %ld (%ld)", b - a,
(char *)b - (char *)a);
return 0;
}
印刷
b-a = -4 (-16)
这表明后续分配可能会返回四倍的单词(但我希望它是特定于实现的——我只在基于 ARM 的手机上尝试过这段代码)。
是否有任何“认可”的方式将单个值推入堆栈,而不是使用预先已知的大小分配它们?
我的意思是:
int x = 4;
push(x, sizeof(x))
int y = *(int *) pop(sizeof(x));
assert(x == y);
我正在寻找一种适用于 x86 和 ARM 的解决方案。(我认为研究这些平台的 ABI 并编写可以扩展为显式操作堆栈指针的程序集的宏是一种选择,但我没有时间自己探索这个)