Pascal 指针指向指针段错误

Pascal pointer to pointer segfault

这棵树由节点组成,子节点表示为指向子节点的指针的链表(= 一个节点可以有无限数量的子节点)。但是链表再次用相同的节点类型表示。实际上 root 节点和 它在 next 的对等节点是另一棵树的根节点,所以它更像是一片森林(=更多的树)。每个节点代表一个字符,这些树中的每条路径都是一个字符串(在输入中以“,”分隔,输入以“.”结尾)。添加字符(节点)以便当您遍历路径时,您打印的字符串将按字母顺序排列。

但是我无法开始创建树,在 {HERE SEGFAULT}:

处返回段错误
type
  PNode = ^TNode;
  TNode = record
    char: char;
    next: PNode;
    children: PNode;
  end;

  PPNode = ^PNode;

var
  character: char;
  root: PNode;
  current_node: PPNode;

function add_before(node: PNode; character: char): PNode;
begin
  new(add_before);
  add_before^.char := character;
  add_before^.next := node;
  add_before^.children := nil;
end;

function find_or_insert_peer(var node: PNode; character: char): PNode;
var last, temp: PNode;
begin
  last := nil;
  temp := node;

  while (temp <> nil) and (temp^.char < character) do
  begin
    last := temp;
    temp := temp^.next;
  end;

  if (temp <> nil) and (temp^.char = character) then
  begin
    find_or_insert_peer := temp;
  end else begin
    find_or_insert_peer := add_before(temp, character);
    if last = nil then
    begin
      node := find_or_insert_peer;
    end else begin
      last^.next := find_or_insert_peer;
    end;
  end;
end;

begin
  root := nil;
  read(character);
  while character <> '.' do
  begin
    current_node := @root;

    while (character <> ',') and (character <> '.') do
    begin
      current_node^ := find_or_insert_peer(current_node^, character)^.children;
      writeln(root^.char); {HERE SEGFAULT}
      read(character);
    end;

    if character = ',' then
      read(character);
  end;
end.

输入aa,vv.

请注意,find_or_insert_peer 接受指向 TNode 的指针(首先是 root)作为引用,以便它可以将其更改为指向正确的第一个节点(例如按字母顺序首先应该是新节点,或者根本没有节点)。

你得到 SEGFAULT 因为这条线:

current_node^ := find_or_insert_peer(current_node^, character)^.children;

在对 find_or_insert_peer() 的调用中,您按预期修改了参数 current_node^ 的内容(也间接修改了 root)。但是,然后,根据所述函数的 return,您将 children(即 nil)分配给相同的 current_node^,因此也分配给 root.

由于root的内容为nil而触发错误