【发布时间】:2019-09-13 10:13:33
【问题描述】:
我已经创建了节点链表。并想使用 recursion 技术反向打印每个节点的数据。我得到了工作代码和段错误代码。我正在尝试了解分段错误代码中的实际问题。
实际上我尝试使用 GDB 进行调试,但我不知道如何解决这个问题。任何线索都将有助于清楚地理解递归。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char c;
struct node *next;
} node_t;
node_t *head = NULL;
void insert_list(node_t *node)
{
static node_t *temp = NULL;
if (!head) {
head = node;
//temp = node;
}
else {
temp->next = node;
}
temp = node;
}
void create_list(char c)
{
node_t *temp = NULL;
temp = malloc(sizeof(node_t));
if (temp) {
temp->c = c;
temp->next = NULL;
insert_list(temp);
}
else
return;
}
void print_list_reversely(node_t *temp)
{
if (!temp)
return;
//print_list_reversely(temp->next); /* Working piece */
temp = temp->next; /* This and next line together*/
print_list_reversely(temp); /* Causing SEGFAULT */
printf("data is %c\n", temp->c);
return;
}
int main()
{
create_list('a');
create_list('b');
create_list('c');
print_list_reversely(head);
return 0;
}
经过一些 GDB 调试得到以下信息:
A) print_list_reversely(temp->next);
Breakpoint 4, print_list_reversely (temp=0x0) at create.c:40
40 if (!temp)
(gdb) p temp
$5 = (node_t *) 0x0
(gdb) n
41 return;
(gdb) n
47 }
(gdb) n
print_list_reversely (temp=0x602050) at create.c:45
45 printf("data is %c\n", temp->c);
=======
B) temp = temp->next; print_list_reversely(temp);
Breakpoint 4, print_list_reversely (temp=0x0) at create.c:40
40 if (!temp)
(gdb) p temp
$3 = (node_t *) 0x0
(gdb) n
41 return;
(gdb) n
47 }
(gdb)
print_list_reversely (temp=0x0) at create.c:45
45 printf("data is %c\n", temp->c);
【问题讨论】:
-
@KamilCuk:您现在可以尝试使用更新后的代码运行吗?
-
您有 多个 空指针取消引用。
-
您的代码有一个空指针取消引用错误。您的代码的实时测试在这里:segfault.stensal.com/a/4D4944dmmS9BarL1您可以修复它并再次测试它。
标签: c recursion linked-list segmentation-fault