1

再帰ループでセグメンテーション違反を作成しましたが、その理由がわかりません。誰か助けてもらえますか?

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

2 に答える 2

4

問題は

node_t array[10];

10個のノードを作成しており、この配列はファイルスコープ(グローバル)で宣言されているため、ゼロで初期化されrightleftポインターの値はになりますNULL

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

これでは、左側のノードのアドレスを渡します。

この声明では

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

*pでありNULL、逆参照NULLするとセグメンテーション違反が発生します。

于 2013-03-24T18:36:39.597 に答える
0

leftrightメンバーをどこに設定したかわかりません。NULLがゼロの場合は設定しorderますが、それ以外の場合はまったく設定しません。それでも、これらのメンバーのアドレスをパラメーターとして再帰的に渡します。明らかに、そのようなアドレスはあなたのコードがアクセスするのに無効です。

それがどのように機能すると思いましたか?

于 2013-03-24T18:35:23.007 に答える