2013-04-24 72 views
0

我正在寻找在C程序中实现一个堆栈,我正在考虑使用无符号字符*作为基础。这将是堆栈的底部,所有其他寄存器和信息将是这个地址的替代。但是,我似乎无法理解如何正确执行此操作。我想这样做是这样的......位移与C指针

//Info: Store 20 at address x0000007c 

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

的C编译器不喜欢这个,所以我不知道如何解决这个问题还是没有失去我的指针类似的东西。

+1

不知道我得到的问题。你不能只设置一个指向你喜欢的某个值的指针,然后离开你去。指针必须指向某个有效的东西。 – John3136 2013-04-24 04:22:36

+0

奇怪。你使用了一个指针变量来存储一个整数值,并使用一个整数来存储一个“地址”(它实际上不是一个地址)。为什么?你在读哪本书? – Sebivor 2013-04-24 04:55:12

+0

@undefinedbehaviour这是一本来自C教科书的Y86模拟器程序。此分配旨在教导读取和执行循环。 – 2013-04-24 05:08:29

回答

3

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

base[address] = 20; 

,或者等价地,

*(base + address) = 20; 

虽然因为基地没有指向有效的内存是不正确的功能。您需要分配你的筹码,无论是作为一个静态数组或通过的malloc,并将其分配给基地,如

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

谢谢你的帮助!我从来没有用malloc分配内存,所以我得到了分段错误。 – 2013-04-24 04:31:16

+0

@melchyy如果我的回答对你有帮助,那么你可以放弃它,并在几分钟内接受它。 – 2013-04-24 04:35:16

+1

@Balter我其实没有足够的代表upvote,但我会接受它! – 2013-04-24 04:39:03

0

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

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

然后你就可以用

*top++ = 'H'; 

推动与

char x = *--top; 
弹出

,并得到大小与

int sz = top-base; 

注意此代码不检查堆栈过/欠流。