2012-07-19 175 views
1
typedef struct{ 

     int key; 
     int priority; 
}array_node; 


array_node *newNode(int key, int priority) { 

    array_node *g; 
    g = (array_node *)calloc(1,sizeof(array_node)); 

    if (NULL==g) { 
     fprintf(stderr, "Out of mem!\n"); 
     return (NULL); 
    } 

    g->key=key; 
    g->priority=priority; 
    return g; 
} 

int main(){ 

    array_node *newNode; 
    newNode->key = 5; 
    newNode->priority = 1000; 

    printf("%d\n",newNode->key); 
} 

大家好!我需要了解爲什麼每次編譯程序時出現分段錯誤。似乎一切都很好,但我不知道錯誤來自哪裏。使用結構的節點

我只是實現了一個節點結構。

+10

這是什麼問題? – Blood 2012-07-19 16:36:13

+1

我猜'malloc(sizeof(array_node *))'應該改成'malloc(sizeof(array_node))'。 – timrau 2012-07-19 16:38:20

+0

這就像一個真人秀節目:「類型問題」 – 2012-07-19 16:39:11

回答

3

首先:

g = (array_node *)malloc(sizeof(array_node *)); 

應該

g = malloc(sizeof(array_node)); 

在第一個你array_node指針分配內存,但你需要array_node對象。當你以後試圖做

g->key=key; 
g->priority=priority; 

你正在引用到內存中的某個地方,而不是對象組件。當然,你不必要的casted malloc返回值(array_node *),因爲在C中你不必從void *中強制轉換。 Here你可以閱讀有關它。

更爲嚴重,另一個錯誤,因爲這是你的賽格故障來自:

array_node *newNode; 
newNode->key = 5; 
newNode->priority = 1000; 

應該是作爲另一個響應指出:

array_node* node = newNode(5, 1000); 

在你的版本中,你只需要創建一個指針到array_node對象(只是一個地址到內存),所以你不能引用鍵或優先級,因爲它們不存在。


現在我看到你所改變的malloc到

array_node *g; 
g = (array_node *)calloc(1,sizeof(array_node)); 

釋放calloc當你想爲一個數組分配內存,你應該使用。在你的情況下,你應該使用malloc,你可以在上面找到它。

+2

也會發表評論,如果這是C,你不應該鑄造該malloc。 – ardent 2012-07-19 16:40:43

+0

真的,謝謝:) – Blood 2012-07-19 16:42:04

+0

但如果我不施放它,我得到這個錯誤:my_heaps。c:78:錯誤:無效轉換從'void *'到'array_node *' – 2012-07-19 16:43:43

2

查找在main():

array_node *newNode; 

該指針有一個未定義的值。正確的是:

array_node *node = newNode(5, 1000); 
+0

爲什麼這是downvoted? – catchmeifyoutry 2012-07-19 16:46:10

+0

可能是因爲最初還有另一個錯誤導致了問題。只做這個改變不會解決代碼問題。 – 2012-07-19 16:50:51

+1

不完全是降低這個答案而不是提高其他答案的好理由。 – ardent 2012-07-19 16:53:19

3

試試這個

// use these headers 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct{ 
    int key; 
    int priority; 
}array_node; 

array_node *newNode(int key, int priority) { 

    // sizeof(array_node), not sizeof(array_node) == sizeof(void*) == 4 or 8 typically 
    array_node *g = malloc(sizeof(array_node)); 

    if (NULL==g) { 
    fprintf(stderr, "Out of mem!\n"); 
    return (NULL); 
    } 

    g->key=key; 
    g->priority=priority; 
    return g; 
} 

int main(){ 
    /// call the function, not just type its name 
    array_node* n = newNode(5, 1000); 

    printf("Key = %d, Priority = %d\n", n->key, n->priority); 

    return 0; 
} 

手錶右括號,它不是Python的,它是C的printf()函數不會打擾想着你。它只會打印n的地址。

+0

我跟着你張貼在這裏的一切,但我得到這個錯誤: my_heaps.c:在函數 'array_node * newNode(INT,INT)': my_heaps.c:78:錯誤:從 '無效*' 到「array_node無效的轉換*」 – 2012-07-19 17:02:30

+0

沒關係我能夠通過將該 array_node * G =(array_node *)malloc的(的sizeof(array_node))來解決該問題; 感謝這麼MCH – 2012-07-19 17:05:01

+0

然後就離開劇組到(array_node *)。您正在使用的編譯器將您的文件視爲C++源代碼,而不是普通的C. – 2012-07-19 17:14:14