【问题标题】:What is segmentation fault (core dumped) mean?分段错误(核心转储)是什么意思?
【发布时间】:2014-03-27 12:25:05
【问题描述】:

我对 C 比较陌生,我不明白这意味着什么。当我尝试运行下面的代码时,我得到了Segmentation fault (core dumped) 错误。目的只是制作节点的“地图”。节点可能具有三个指向另一个节点的指针,有些具有全部三个,有些则没有。如果他们不这样做,我将结构中的指针指向 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;
 }

究竟是什么导致了这个分段错误,它是什么意思?另外,能否提供解决方案来修复此代码 sn-p here?

【问题讨论】:

  • 你没有在 makenode 中为 node_ptr 分配内存。
  • segmentation fault(简称seg fault)是当你尝试去引用一个未初始化的指针时引起的。因此,如果您有一个指针 node_ptr temp; 并且您尝试执行 temp-&gt;ch = any;,则会出现段错误。请参阅here 了解导致此问题的其他方式
  • "如果你有一个指针 node_ptr temp;并且你尝试做 temp->ch = any;,你会得到 seg fault" - 不一定。它是未初始化的,所以它可能指向任何位置——可能是有效的,也可能不是,但肯定不是“免费”的——覆盖它会导致问题。

标签: c pointers segmentation-fault


【解决方案1】:

这意味着您正在访问不允许访问的内存。在这里,您在 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. ...

【讨论】:

  • 这可能是一个愚蠢的问题,但是您如何知道何时需要在堆中分配内存以及何时将其放入堆栈?是不是因为我正在创建一个在两个函数中使用的节点,当该函数结束时,指针丢失并且它不返回?
  • @JeremyRuten 我要补充一点,A = makeNode('A', B, NULL, NULL); 不起作用,因为此时代码中尚未初始化 B
  • @user3268401 你从来没有在堆栈上创建节点,只是指向它的指针,它指向 。但是无论如何,您不能可靠地返回指向函数局部变量的指针,因为它可能会在下一次函数调用时被覆盖(不仅仅是这个函数 - 任何一个)。
  • 是的,你在栈上分配的任何东西都会在函数结束时消失。因此,如果您在堆栈上分配节点,您不想返回指向它的指针。您可以在堆栈上分配,并返回节点本身(而不是指针),这基本上会将整个节点从 makeNode() 的堆栈部分复制到 main() 的堆栈部分。但是传递指针比传递大结构要便宜很多,这就是为什么你通常在堆上分配一个结构并传回一个指向它的指针。
猜你喜欢
  • 1970-01-01
  • 2020-03-16
  • 2013-11-07
  • 2017-01-26
  • 2015-06-25
相关资源
最近更新 更多