2014-02-12 47 views
1

我是C新手。我用一些结构实现了一个简单的堆栈,而不是。我已经发布了下面的整个代码。问题部分被评论。C堆栈指向地址?

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdlib.h> 

typedef struct Node{ 
    int data; 
    struct Node *next; 
} Node; 
typedef struct Stack{ 
    Node *top; 
    int size; 
} Stack; 

/* Function Prototypes */ 
void push(Stack *sPtr, int data); 
int pop(Stack *sPtr); 
void create(Stack *sPtr); 

int main(void) 
{ 
    static Stack first; 
    create(&first); 

    push(&first,4); 
    push(&first,3); 
    push(&first,2); 

    printf("%d\n",pop(&first)); 
    printf("%d\n",pop(&first)); 
    printf("%d\n",pop(&first)); 
    exit(1); 
} 

void push(Stack *sPtr, int data) 
{ 
    struct Node newNode; 
    newNode.data = data; 
    newNode.next = sPtr->top; 
    sPtr->top = &newNode; 
    sPtr->size++; 
    printf("%d\n",sPtr->top->data); 
} 
int pop(Stack *sPtr) 
{ 
    struct Node *returnNode = sPtr->top; 
    struct Node *topNode = sPtr->top; 
    if(sPtr->size != 0){ 
     sPtr->top = topNode->next; /* =============PROBLEM?=============== */ 
     return returnNode->data; 
    } 
    else{ 
     printf("Error: Stack is Empty!\n"); 
     return -1; 
    } 
} 
void create(Stack *sPtr) 
{ 
    sPtr->size = 0; 
    sPtr->top = NULL; 
} 

此代码的输出是

4 
3 
2 
2 
8103136 
680997 

所以,很显然,它是拉动关闭顶部节点,然后打印接下来的两个节点的地址,而不是他们的数据。

但为什么这样做?据我知道(这是小)预成型此操作

sPtr->top = topNode->next; 

应该告诉程序做出top现在指向到topNode.next。但相反,它似乎正在返回地址。这里发生了什么?

+0

'pop()'永不减小'size'。 –

回答

4

在您的push()函数中,您将创建一个新的struct Node并将其添加到您的堆栈中。但是,该节点是push()范围内的一个局部变量 - 分配在堆栈上(而不是堆栈,调用堆栈),并且当push()返回时将不再有效。

你想要做的是在上创建节点,这意味着它将在push()返回后仍然存在。

既然你用C编码,你想要做的事,如:

struct Node *newNode = (struct Node*)malloc(sizeof(struct Node)); 

既然现在你要处理的堆分配的内存,你需要确保一些指出它使用free()释放(某处)。

Jonathan指出,你也不会递减size

+0

斑点;我甚至没有看'push()',因为'pop()'在确定的点处显然存在问题。它只是表明哪里有一个bug,通常还有更多。 –

+0

感谢您的回答。在阅读了'malloc'和'free'之后,我想我现在对它有了更好的理解。 – JcKelley

3

的一个问题是,pop()从未递减size,所以size真的是“元素的数量不断被推入堆栈”,而不是“在当前栈元素的数目”。

int pop(Stack *sPtr) 
{ 
    struct Node *returnNode = sPtr->top; 
    struct Node *topNode = sPtr->top; 
    if (sPtr->size != 0) 
    { 
     sPtr->top = topNode->next; 
     sPtr->size--; 
     return returnNode->data; 
    } 
    else 
    { 
     fprintf(stderr, "Error: Stack is Empty!\n"); 
     return -1; 
    } 
} 

另一个麻烦,在他answer指出的unluddite是你没有正确推送数据。你需要两个修补程序才能安全。可能还有其他问题(比如没有正确释放内存—或者根本就没有),但是这两个会让你走很长的路。

+0

你是对的,谢谢你的收获!看来内存分配是主要的错误。如果我能接受两个,我也会碰到你的! – JcKelley