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作为索引时,现在的答案是一致的。 –