2014-02-16 98 views
0

我在C中實現Stack ADT。棧遵循一個數組實現,其中數組是void *的數組。下面的行爲困惑我,任何人都可以提供一些見解?我的地址&i始終是相同的,因此,我通過彈出它獲得的值應該是相同的,但它不是。另外,這些數字是相反的順序。我錯過了什麼?C棧實現

#include <stdio.h> 
#include "stack.h" 

int main(int argc, char const *argv[]) 
{ 
    Stack* s = Stack_Create(10); 
    int i; 
    for (i = 0; i < 10; i++){ 
     Stack_Push(s, &i); 
    } 
    for (i = 0; i < 10; i++){ 
     printf("%d\n", *((int *)Stack_Pop(s))); 
    } 
    Stack_Destroy(s); 
    return 0; 
} 

打印:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

棧的實現:

​​

頭文件:

#include <stdlib.h> 
#ifndef __STACK_H__ 
#define __STACK_H__ 
struct Stack; 
typedef struct Stack Stack; 

Stack* Stack_Create(size_t n); 
void Stack_Destroy(Stack* s); 
void Stack_Push(Stack* s, void* e); 
void* Stack_Pop(Stack* s); 
int Stack_Empty(Stack* s); 
#endif 
+0

爲什麼這是downvoted? –

+2

您正在使用的變量的地址或循環迭代在整個堆棧中被複制。你只需要在堆棧中推送一個地址,即'&i'。因此,解除引用*任何東西*你彈出將導致'&i',這恰好也是你正在使用的循環控制變量的解引用。即你正在修改'i',並且因爲'我'的地址是堆棧中唯一的東西(反覆),所以你的打印只不過是'printf('%d \ n,i);'這樣做:在你的堆棧推入函數中放置一個'printf(%p \ n「,e);'看看會發生什麼。 – WhozCraig

+0

謝謝,使用j作爲索引時,現在的答案是一致的。 –

回答

1

通過彈出它關閉,我應該得到的值是一樣的,但它不是

是的。

數字是按相反的順序

不,他們不是。要打印在第二循環中,其範圍從0到9注*i連續值:

*((int *)Stack_Pop(s)) 

*&i是簡單地i