C - 构造函数,最好返回结构体还是指向结构体的指针?

Hat*_*end 0 c struct pointers

我目前正在用 C 制作一个 RedBlackTree,但在为您的结构提供构造函数时,我仍然不明白哪个更好/更理想。

struct RedBlackTree* RedBlackTree_new()
{
    struct RedBlackTree *tree = calloc(1, sizeof(struct RedBlackTree));
    if (tree == NULL)
        error(DS_MSG_OUT_OF_MEM);
    return tree 
}
Run Code Online (Sandbox Code Playgroud)

对比。

struct RedBlackTree RedBlackTree_new()
{
    struct RedBlackTree tree;
    tree.root = NULL;
    tree.size = 0;
    return tree;
}
Run Code Online (Sandbox Code Playgroud)

我的意思是,如果我选择第二个选项,那么我必须不断地将它作为指针传递给我的函数&,据我所知,在我的程序结束之前我永远无法销毁它(有人可以验证这是否属实?)。例如,如果destroy我的 Tree有一个函数,RedBlackTree如果它们不是用malloc或创建的,我将无法释放从结构中分配的内存,calloc对吗?

同样在更一般的情况下,两者的优点和缺点是什么?我总是可以通过 using 从指针中检索数据,*并且我总是可以通过 using将我的数据转换为指针&,所以几乎感觉它们在某种意义上是完全可以互换的。

Jac*_*ack 5

真正的区别在于对象的生命周期。通过动态分配(malloc/callocfree)在堆上分配的对象会一直存在,直到它被显式释放。

相反,具有自动存储的对象(如您的第二个示例中)仅在声明它的范围内存活,并且必须复制到其他地方才能使其存活。

因此,这应该有助于您选择哪种更适合特定情况。

从效率的角度来看,动态分配更昂贵,需要额外的间接寻址,但允许您传递指针,从而防止数据被复制,因此在其他情况下可能更有效,例如。当对象很大并且副本会很昂贵时。