2014-02-12 45 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