C ++ malloc从`void *'无效转换结构

时间:2016-04-05 18:04:26

标签: c++ c pointers dynamic-memory-allocation

当我尝试malloc() struct bstree节点时,我的编译器报告错误:

  

来自' void *'的无效转换到' bstree *'

这是我的代码:

struct bstree {
    int key;
    char *value;

    struct bstree *left;
    struct bstree *right;
};

struct bstree *bstree_create(int key, char *value) {
    struct bstree *node;

    node = malloc(sizeof (*node));

    if (node != NULL) {
        node->key = key;
        node->value = value;
        node->left = NULL;
        node->right = NULL;
    }
    return node;
}

3 个答案:

答案 0 :(得分:8)

在C ++中,没有从类型void *到其他类型的指针的隐式转换。您必须指定显式转换。例如

node = ( struct bstree * )malloc(sizeof (*node));

node = static_cast<struct bstree *>( malloc(sizeof (*node)) );

同样在C ++中,您应该使用运算符new而不是C函数malloc

答案 1 :(得分:2)

在C中,您的代码是&#34;罚款&#34;。

在C ++中,您想要定义一个构造函数:

struct bstree {
    int key;
    char *value;

    bstree *left;
    bstree *right;

    bstree (int k, char *v)
        : key(k), value(v), left(NULL), right(NULL)
    {}
};

然后使用new,例如:node = new bstree(key, value);

答案 2 :(得分:0)

演员会修复此错误:

node = (struct bstree *) malloc(sizeof (*node));

我已经展示了一个C风格的演员阵容,因为代码似乎是C.还有一个C ++风格的演员阵容:

node = static_cast<struct bstree *>(malloc(sizeof (*node)));