2014-02-16 76 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