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

问题描述

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

解决方法

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