用C指针移位

时间:2013-04-24 04:18:39

标签: c pointers memory-address

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

//Info: Store 20 at address x0000007c

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

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

2 个答案:

答案 0 :(得分:3)

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

 base[address] = 20;

或等同地

 *(base + address) = 20;

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

 unsigned char* base = malloc(STACKSIZE);
 if (!base) out_of_memory();

答案 1 :(得分:0)

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

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

然后你可以用

推进
*top++ = 'H';

并弹出

char x = *--top;

并使用

获取大小
int sz = top-base;

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