【发布时间】:2016-03-31 19:10:09
【问题描述】:
为了理解 Trie,我创建了一个非常简单的 C 程序,它从用户 0 到 9 的 10 个 nums 作为 trie 的子节点。最后一步是用函数print 打印这个数字,但我遇到了分段错误:
#include <stdio.h>
#include <stdlib.h>
typedef struct list
{
int data;
struct list *ar[10];
} list;
void insert(list *head);
void print(list *head);
int main(void)
{
printf("hello\n");
list *root = malloc(sizeof(list));
insert(root);
print(root);
}
void insert(list *head)
{
int a, i;
if (head == NULL) {
return;
}
for (i = 0; i < 10; i++) {
printf("Give Num 0-9\n");
scanf("%i", &a);
head->ar[a] = malloc(sizeof(head));
head = head->ar[a];
head->data = a;
}
}
void print(list *head)
{
if (head == NULL) {
return;
}
while (head != NULL) {
for (int i = 1; i < 10; i++) {
if (head->ar[i] != NULL) {
printf("%i", i);
head = head->ar[i];
break;
}
}
}
printf("\n");
}
【问题讨论】:
-
你从来没有真正检查过
scanf的返回值或者a是否保持在0-9之间 -
malloc()分配的对象未初始化。您只为root->arr[a]写入一个有效值,但尝试读取(如果它们为非空,则取消引用)数组中的所有指针。 -
为了简单起见,我以这种方式制作,我得到了正确值的段错误
-
另外,您只是分配指针的大小,而不是实际的列表结构! - 也许你的意思是
malloc(sizeof(list))? -
@Spyreto:在这种情况下,您需要提供一个更好的示例。通过使用未初始化的值,您提供的显然表现出未定义的行为。