2014-03-27 37 views
0

我對C相對比較陌生,我不明白這是什麼意思。當我嘗試運行下面的代碼時,出現Segmentation fault (core dumped)錯誤。用於製作節點「地圖」的目的。節點可能有三個指向另一個節點的指針,其中一些有三個指針不指向另一個節點。如果他們不這樣做,我將結構中的指針指向NULL。我做了一個返回node_ptr的函數。什麼是分段錯誤(core dumped)是什麼意思?

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

typedef struct Node *node_ptr; 

struct Node { 
    char ch; 
    node_ptr firstPtr; 
    node_ptr secondPtr; 
    node_ptr thirdPtr; 
}; 

node_ptr makeNode(char any, node_ptr x, node_ptr y, node_ptr z){ 
     node_ptr temp; 
     temp->ch = any; 
     temp->firstPtr = x; 
     temp->secondPtr = y; 
     temp->thirdPtr = z; 

     return temp; 
} 

int main(){ 
    printf("Making a map....."); 

node_ptr A, B, C, D, E, F, G, H; 

A = makeNode('A', B, NULL, NULL); 
B = makeNode('B', A, C, F); 
C = makeNode('C', B, D, NULL); 
D = makeNode('D', C, E, NULL); 
E = makeNode('E', D, NULL, NULL); 
F = makeNode('F', B, G, H); 
G = makeNode('G', F, NULL, NULL); 
H = makeNode('H', F, NULL, NULL); 

return 0; 
} 

究竟是什麼導致了這種分段錯誤,這是什麼意思?另外,能否提供解決方案來解決此代碼段?

+0

你是不是分配內存在makenode到node_ptr。 – Balu

+0

當您嘗試解除引用未初始化的指針時,會導致分段錯誤(簡稱爲seg fault)。所以如果你有一個指針'node_ptr temp;'並且你嘗試'temp-> ch = any;',你會得到seg故障。請參閱[這裏](https://en.wikipedia.org/wiki/Segmentation_fault#Causes)對於其他引起這種情況的方法 – smac89

+0

「如果您有一個指針node_ptr temp;並且您嘗試執行temp-> ch = any;你會得到seg故障「 - 不一定。它是未初始化的,所以它可能指向任何位置 - 可能是有效的,也可能不是,但肯定不是「自由」的 - 覆蓋它會導致問題。 – keltar

回答

4

這意味着你正在訪問你不允許訪問的內存。在這裏,你正在makeNode()的開頭創建一個指向節點的指針,但是你沒有指向任何東西。它可能指向任何地方。然後你嘗試用值填充它所指向的東西,但無論它碰巧指向哪個地方,都是你無法訪問的地方(它可能是一個正在用於其他事情的內存區域)。

你想要做的是爲節點分配內存,將節點指針指向該內存,然後用值填充並返回它。喜歡的東西:

node_ptr makeNode(char any, node_ptr x, node_ptr y, node_ptr z){ 
     node_ptr temp = (node_ptr) malloc(sizeof(struct Node)); 
     temp->ch = any; 
     temp->firstPtr = x; 
     temp->secondPtr = y; 
     temp->thirdPtr = z; 

     return temp; 
} 

然後確保當你不再需要它取消此分配內存,通過調用free()

free(A); 
free(B); 
free(C); 
... etc. ... 
+0

這可能是一個愚蠢的問題,但是如何知道何時需要在堆中分配內存與何時將其放入堆棧?是因爲我創建了一個在兩個函數中使用的節點,並且當該函數結束時,指針丟失並且不返回? – user3268401

+0

@JeremyRuten我會補充說:'A = makeNode('A',B,NULL,NULL);'不會工作,因爲在代碼中'B'尚未初始化。 – user3386109

+0

@ user3268401您從來沒有在堆棧上創建節點,只有指向它的指向的節點。但無論如何,你不能可靠地返回指向函數局部變量的指針,因爲它可能會在下一次函數調用時被覆蓋(不僅僅是這個函數 - 任何一個函數)。 – keltar