C 段故障函数参考
C Segmentation fault function reference
sizeH(node *ptr)
函数上的 if(ptr->is_word)
导致分段错误。
dictionary.c:120:13: runtime error: member access within null pointer of type 'node' (aka 'struct node')
dictionary.c:120:13: runtime error: load of null pointer of type '_Bool'
Segmentation fault
如果我在这个 if 条件之前将 if
条件添加到 return 特定值,代码将执行并且我确保根不为空
所以我想问题是 ptr
没有正确传递给 sizeH
函数。
unsigned int size(void)
{
node *ptr = root;
printf(ptr->is_word ? "true" : "false");
unsigned int count = sizeH(ptr);
printf("COUNTER IN SIZE %d\n" , count);
return 0;
}
unsigned int sizeH(node *ptr){
if(ptr->is_word)
{
return 1;
}
else
{
for(int x = 0; x < N; x++){
return 0 + sizeH(ptr->children[x]);
}
}
return 0;
}
您的 sizeH
函数存在一些基本问题。首先它不检查传入的 ptr
不是 NULL
。这很可能发生,因为您的函数是递归的,并且您有为每个 child 节点调用的循环。
for(int x = 0; x < N; x++){
return 0 + sizeH(ptr->children[x]);
}
除了循环中的代码是错误的,它只会在第一个 child 时被调用,这是第二个问题。因为您在循环中使用 return
,所以它只会 运行 一次。相反,您应该为每个 child 节点计算 returned 的值,然后计算 return 那个。
进行上述两项更改将使您的函数看起来像这样。
unsigned int sizeH(node *ptr) {
if(ptr==NULL) {
return 0;
} else if(ptr->is_word) {
return 1;
} else {
unsigned int ret = 0;
for(int x = 0; x < N; x++) {
ret += sizeH(ptr->children[x]);
}
return ret;
}
// return 0; This isn't needed - the code will never reach here.
}
同样值得选择一种编码格式样式并坚持使用它而不是混合使用,因为它可以使代码更整洁。
sizeH(node *ptr)
函数上的 if(ptr->is_word)
导致分段错误。
dictionary.c:120:13: runtime error: member access within null pointer of type 'node' (aka 'struct node')
dictionary.c:120:13: runtime error: load of null pointer of type '_Bool'
Segmentation fault
如果我在这个 if 条件之前将 if
条件添加到 return 特定值,代码将执行并且我确保根不为空
所以我想问题是 ptr
没有正确传递给 sizeH
函数。
unsigned int size(void)
{
node *ptr = root;
printf(ptr->is_word ? "true" : "false");
unsigned int count = sizeH(ptr);
printf("COUNTER IN SIZE %d\n" , count);
return 0;
}
unsigned int sizeH(node *ptr){
if(ptr->is_word)
{
return 1;
}
else
{
for(int x = 0; x < N; x++){
return 0 + sizeH(ptr->children[x]);
}
}
return 0;
}
您的 sizeH
函数存在一些基本问题。首先它不检查传入的 ptr
不是 NULL
。这很可能发生,因为您的函数是递归的,并且您有为每个 child 节点调用的循环。
for(int x = 0; x < N; x++){
return 0 + sizeH(ptr->children[x]);
}
除了循环中的代码是错误的,它只会在第一个 child 时被调用,这是第二个问题。因为您在循环中使用 return
,所以它只会 运行 一次。相反,您应该为每个 child 节点计算 returned 的值,然后计算 return 那个。
进行上述两项更改将使您的函数看起来像这样。
unsigned int sizeH(node *ptr) {
if(ptr==NULL) {
return 0;
} else if(ptr->is_word) {
return 1;
} else {
unsigned int ret = 0;
for(int x = 0; x < N; x++) {
ret += sizeH(ptr->children[x]);
}
return ret;
}
// return 0; This isn't needed - the code will never reach here.
}
同样值得选择一种编码格式样式并坚持使用它而不是混合使用,因为它可以使代码更整洁。