0

BSTを構築し、それにノードを挿入しようとしています。ただし、新しいノードを作成している間、exc_badアクセスエラーが発生し続けます。理由は何でしょうか。これが私のコードです:

struct Node *node_create(struct BSTree *bst,void *nodeKey, struct Value *nodeVal, struct     Node *rightChild, struct Node *leftChild)
{
struct Node *node = malloc(sizeof *node);
nodeKey= malloc (sizeof (bst->key_size));
nodeVal = malloc(sizeof(bst->value_size));
size_t sizeKey = sizeof(nodeKey);
memcpy(node->key, nodeKey, sizeKey);  // exc_bad access
size_t sizeVal = sizeof (nodeVal);
memcpy(node->val, nodeVal, sizeVal); // exc_bad access
node->right = rightChild;  
node->left = leftChild;

return node;

}

struct Node {
void *key;
struct Value *val;
struct Node *left;
struct Node *right;
};



struct BSTree {
size_t key_size, key_alignment;
size_t value_size, value_alignment;
int (*compare_func)(void *, void *);
struct Node *root;
// ... Maybe some other stuff.
};

struct Value {
char name[10];
int id;
};
4

2 に答える 2

2

Nodeがどのように見えるかを知らなくても、割り当てたとしてもnode、すべてのメンバー(ポインターのように見える)を割り当てたわけではありません。

コードを次のように変更します。

// Allocate node
struct Node *node = malloc(sizeof *node);
// Now members
node->key = malloc (sizeof (bst->key_size)); 
// :

キーと値を渡す場合は、memcpyこれらの値のいずれかを上記の場所に渡します。しかし、それ以上のコードなしで言うのは難しい...

于 2013-02-07T14:28:22.233 に答える
0

ノード構造を見ずに、あなたがやりたいことは次のとおりだと思います。

ノードが次のように定義されている場合

struct Node {
    void *key;
    struct Value *val;
    struct Node *right;
    struct Node *left;
};

それから

struct Node *node_create(struct BSTree *bst,void *nodeKey, struct Value *nodeVal, struct     Node *rightChild, struct Node *leftChild)
{
struct Node *node = malloc(sizeof *node);

  node->key = malloc(bst->key_size);          /* No sizeof here */
  node->val = malloc(bst->value_size);
  memcpy(node->key, nodeKey, bst->key_size);  
  memcpy(node->val, nodeVal, bst->value_size);
  node->right = rightChild;  
  node->left = leftChild;

  return node;
}

mallocsの戻り値(正当化できる設計上の選択)をチェックしないので、そのように簡単に書くこともできます。

struct Node *node_create(struct BSTree *bst,void *nodeKey, struct Value *nodeVal, struct     Node *rightChild, struct Node *leftChild)
{
struct Node *node = malloc(sizeof *node);

  node->key = memcpy(malloc(bst->key_size)  , nodeKey, bst->key_size); 
  node->val = memcpy(malloc(bst->value_size), nodeVal, bst->value_size);
  node->right = rightChild;  
  node->left = leftChild;
  return node;
}

このスタイルに夢中になっている人もいますが、冗長性についてはコードをあまり薄めないほうがいいです。

于 2013-02-07T14:41:20.437 に答える