在GNUC中有没有一种方法可以显式地操作堆栈上的变量数据?

在GNUC中有没有一种方法可以显式地操作堆栈上的变量数据?,c,gcc,gnu,callstack,alloca,C,Gcc,Gnu,Callstack,Alloca,(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

(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;
}
这意味着后续的分配可能会返回四倍的单词(但我希望它是特定于实现的-我只在基于ARM的手机上尝试了这段代码)

是否有任何“认可”的方式将单个值推送到堆栈上,而不是预先已知大小来分配它们

我的意思是:

int x = 4;
push(x, sizeof(x))
int y = *(int *) pop(sizeof(x));
assert(x == y);

我正在寻找一种既适用于x86又适用于ARM的解决方案。(我认为这些平台中的studying ABIs和将扩展到汇编的显式操作堆栈指针的编写宏将是一种选择,但我没有时间自己去探索)

< P>不,没有一种支持的方式来显式地操作这个问题问的方式在GNU C上的堆栈上的变量数据。在堆栈上推送“单个值”是没有经过批准的方法的。

你的问题看起来好像离发明递归函数还有一步之遥。你知道这个概念吗?如果是,请强调如何/为什么不能使用递归来实现您的尝试。这是一个非常重要的问题。你需要解决的真正问题是什么?为什么需要空间连续而不是平台对齐?为什么首先需要动态分配堆栈的大小?Re“…这表明后续分配返回四倍的单词”:不,不是。它在一个测试中显示了两个事物的相对位置,而不是一般的分配规则。如果您的平台没有
malloc
,然后你可能有一个堆栈非常小的平台。
分配自定义缓冲区的问题是我需要决定缓冲区的大小,这是任何裸机程序员从一开始就一直在努力解决的问题。而动态分配就是解决方案。其他解决方案是过度分配到最大可能的大小,或者以递归或类似CPL风格的智能方式编写算法。
int x = 4;
push(x, sizeof(x))
int y = *(int *) pop(sizeof(x));
assert(x == y);