我正在C中实现堆栈ADT。堆栈遵循数组实现,其中数组是void *
的数组。以下行为让我感到困惑,任何人都可以提供一些见解吗? i &i
的地址总是相同的,因此,我通过弹出它获得的值应该是相同的,但事实并非如此。此外,数字的顺序相反。我错过了什么?
#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 "stack.h"
struct Stack
{
size_t size;
size_t top;
void** e;
};
Stack* Stack_Create(size_t n)
{
Stack* s = (Stack *)malloc(sizeof(Stack));
s->size = n;
s->top = 0;
s->e = (void**)malloc(sizeof(void*) * (n + 1));
return s;
}
int Stack_Empty(Stack* s)
{
if (s->top == 0)
{
return 1;
} else {
return 0;
}
}
void Stack_Push(Stack* s, void* e)
{
if (s == NULL) return;
if (s->top == s->size) return;
s->top = s->top + 1;
s->e[s->top] = e;
}
void* Stack_Pop(Stack* s)
{
if (Stack_Empty(s)) return NULL;
s->top = s->top - 1;
return s->e[s->top+1];
}
void Stack_Destroy(Stack* s)
{
if (s == NULL) return;
free(s->e);
free(s);
}
标题文件:
#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 :(得分:1)
我通过弹出它获得的值应该是相同的,但它不是
是的。
数字的顺序相反
不,他们不是。您正在第二个循环中打印i
的连续值,范围从0到9.请注意*
:
*((int *)Stack_Pop(s))
*&i
只是i
。