什么是分段错误(核心转储)意味着什么?

时间:2014-03-27 04:19:21

标签: c pointers segmentation-fault

我对C比较陌生,我不明白这意味着什么。当我尝试运行下面的代码时,我收到Segmentation fault (core dumped)错误。目的是制作一张地图"节点节点可能有三个指向另一个节点的指针,一些节点可能有三个指针。如果它们没有,我将struct指针中的指针指向NULL。我创建了一个返回node_ptr的函数。

#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;
 }

究竟是什么原因造成了这种细分错误,是什么意思?此外,是否可以提供解决方案来修复此代码段?

1 个答案:

答案 0 :(得分:4)

这意味着您正在访问您无法访问的内存。在这里,您正在指向makeNode()开头的节点,但您并未将其指向任何位置。它可能指向任何地方。然后你尝试用值来填充它所指向的东西,但是它恰好指向的地方是你无法访问的地方(它可能是一个用于其他东西的内存区域)。 / p>

您要做的是为节点分配内存,将节点指针指向该内存,然后用值填充并返回它。类似的东西:

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. ...