2013-04-24 76 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; 

注意此代碼不檢查堆棧過/欠流。