我在递归循环中创建了一个分段错误,但不明白为什么。有人能帮助我吗?
struct node{
int value;
int order;
struct node *left;
struct node *right;
};
typedef struct node node_t;
node_t array[10];
void createTree(node_t **p, int order){
(*p)->value = rand()%10;
(*p)->order = order;
printf("%i", (*p)->value);
printf(" ");
printf("%i\n", (*p)->order);
if (!order){
(*p)->left = NULL;
(*p)->right = NULL;
return;
}
//I believe that here is the origin of the problem...
createTree(&(*p)->left, order-1);
createTree(&(*p)->right, order-1);
}
int main(void)
{
node_t *root = &array[0];
srand(time(NULL));
createTree(&root, 1);
printf("%i\n", root->value);
return 1;
}
答案 0 :(得分:4)
问题是
node_t array[10];
您正在创建10个节点,并且由于此数组是在文件范围(全局)中声明的,因此它是零初始化的,因此right
和left
指针的值将为NULL
。< / p>
现在
createTree(&(*p)->left, order-1);
在这里你传递左节点的地址。
在本声明中
(*p)->value = rand()%10;
*p
为NULL
,解除引用NULL
会产生细分错误。
答案 1 :(得分:0)
我看不到您设置left
和right
成员的位置。如果NULL
为零,则将它们设置为order
,否则您根本不设置它们。然而,您将这些成员的地址递归地作为参数传递。显然,这样的地址对于访问是无效的,您的代码就是这样做的。
您是如何期望这样的?