什么原因导致分段错误?

时间:2013-03-24 18:28:47

标签: c pointers

我在递归循环中创建了一个分段错误,但不明白为什么。有人能帮助我吗?

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;
}

2 个答案:

答案 0 :(得分:4)

问题是

node_t array[10];

您正在创建10个节点,并且由于此数组是在文件范围(全局)中声明的,因此它是零初始化的,因此rightleft指针的值将为NULL。< / p>

现在

createTree(&(*p)->left, order-1);

在这里你传递左节点的地址。

在本声明中

(*p)->value = rand()%10;

*pNULL,解除引用NULL会产生细分错误。

答案 1 :(得分:0)

我看不到您设置leftright成员的位置。如果NULL为零,则将它们设置为order,否则您根本不设置它们。然而,您将这些成员的地址递归地作为参数传递。显然,这样的地址对于访问是无效的,您的代码就是这样做的。

您是如何期望这样的?