-1

(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 并编写可以扩展为显式操作堆栈指针的程序集的宏是一种选择,但我没有时间自己探索这个)

4

1 回答 1

0

不,没有一种受支持的方法可以按照这个问题提出的方式在 GNU C 中显式操作堆栈上的变量数据。没有认可的方式将“单一值”压入堆栈。

于 2020-08-25T10:05:26.757 回答