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而触发错误
这棵树由节点组成,子节点表示为指向子节点的指针的链表(= 一个节点可以有无限数量的子节点)。但是链表再次用相同的节点类型表示。实际上 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而触发错误