0

我希望在 C 程序中实现一个堆栈,我正在考虑使用 unsigned char * 作为基础。这将是堆栈的底部,所有其他寄存器和信息将是该地址的位移。但是,我似乎无法理解如何正确执行此操作。我正在考虑做这样的事情......

//Info: Store 20 at address x0000007c

unsigned char * base = 0;
int address = x0000007c;
(base + address) = 20;

C 编译器不喜欢这样,所以我想知道如何在不丢失指针的情况下解决这个问题或做类似的事情。

4

2 回答 2

3

编译器不喜欢你的代码,因为它在概念上是错误的;base + address 不是左值,即使它有错误的类型:你不能将 int 存储到 char* 中。但这在逻辑上是正确的:

 base[address] = 20;

或者,等效地,

 *(base + address) = 20;

尽管它在功能上不正确,因为 base 没有指向有效的内存。您需要分配堆栈,作为静态数组或通过 malloc,并将其分配给基,例如,

 unsigned char* base = malloc(STACKSIZE);
 if (!base) out_of_memory();
于 2013-04-24T04:20:21.177 回答
0

对于堆栈,最简单的可能是使用两个指针,

enum { STACKSZ = 100 };
char *base = malloc(STACKSZ);
char *top = base;

然后你可以用

*top++ = 'H';

并弹出

char x = *--top;

并获得尺寸

int sz = top-base;

请注意,此代码不检查堆栈溢出/下溢。

于 2013-04-24T04:26:30.730 回答