【发布时间】:2014-02-16 03:30:48
【问题描述】:
我在 C 中实现 Stack ADT。Stack 遵循数组实现,其中数组是 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
【问题讨论】:
-
为什么这被否决了?
-
您正在使用的变量的地址或您的循环迭代将在整个堆栈中复制。您只能将一个地址压入堆栈,即
&i。因此,取消引用您弹出的 anything 将导致取消引用&i,这恰好也是您正在使用的循环控制变量。 IE。你的循环正在修改i,因为i的地址是堆栈上唯一的东西(重复),你的打印只不过是printf("%d\n, i);这样做:在你的堆栈推送中放一个printf(%p\n", e);运行并观察会发生什么。 -
谢谢,现在使用j作为索引时答案是一致的。
-
使用
j作为第二个循环的索引,这应该每次打印10(i的值)。 -
居然设法找到了关于这个的上一个问题:Odd problem with pointer while implementing a linked list
标签: c pointers data-structures stack