2013-05-25 56 views
1

我昨天花了幾個小時在我的程序中找到一個錯誤。我可以將其分解爲以下內容。代碼沒有多大意義。但問題是,如果我在功能fillTree離開了線C程序奇怪的行爲 - 指針和內存

BST root2 = (BST) malloc(sizeof(BST)); 

()的程序在做什麼它應該。但是取消註釋會導致效果:fillTree()中BST root3的數據字段從NULL更改爲不同。 但我不明白爲什麼會發生這種情況。

所以註釋掉我得到以下輸出:

root3->data is still null! 

但它應該是(行註釋):

root3->data is still null! 
root3->data is still null! 
root3->data is still null! 
root3->data is still null! 

請幫幫我!

非常感謝!

#include <stdio.h> 
#include <stdlib.h> 

typedef struct BSTTag{ 
    struct BSTTag* lNode; 
    struct BSTTag* rNode; 
    void *data; 
    int (*compare)(void*, void*); 
} *BST; 


BST createTree(BST root) { 
    if(root == NULL) { 
    BST bst = (BST) malloc(sizeof(BST)); 
    bst->lNode = NULL; 
    bst->rNode = NULL; 
    bst->data = NULL; 
    return bst; 
    } 
    return root; 
} 

BST fillTree(BST root, int n) { 
    int i; 
    BST root3 = NULL; 
    // error occurrs if this line is not commented 
    //BST root2 = (BST) malloc(sizeof(BST)); 
    for(i = n; i > 0; i--) { 
    int *rd = (int *)malloc(sizeof(int)); 
    *rd = i; 
    if(i == n) { 
     root3 = createTree(NULL); 
    } 
    if(root3->data == NULL) { 
     printf("root3->data is still null!\n"); 
    } 
    } 
    return root; 
} 

int main(void) { 
    fillTree(NULL, 4); 
} 

回答

6

你只爲一個指針分配空間,

BST bst = (BST) malloc(sizeof(BST)); 

,但你使用它,如果你的結構分配空間,

BST createTree(BST root) { 
    if(root == NULL) { 
    BST bst = (BST) malloc(sizeof(BST)); 
    bst->lNode = NULL; 
    bst->rNode = NULL; 
    bst->data = NULL; 
    return bst; 
    } 
    return root; 
} 

,因此寫過去分配的內存,調用未定義的行爲。

您應該分配適當的大小,

BST bst = (BST) malloc(sizeof(*bst)); 
+0

,那麼你想要的malloc(的sizeof(BSTTag)) –

+0

非常感謝你。它現在正在工作:) – user2221323

+1

另一種'typedef'指針被認爲是有害的'恕我直言。 – wildplasser