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