C - 构造函数,最好返回struct或指向struct的指针?

时间:2016-09-14 02:19:27

标签: c pointers struct

我目前正在使用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 
}

VS

struct RedBlackTree RedBlackTree_new()
{
    struct RedBlackTree tree;
    tree.root = NULL;
    tree.size = 0;
    return tree;
}

我的意思是,如果我做了第二个选项,那么我经常不得不使用&将它作为指针传递给我的函数,据我所知,在我的程序结束之前我永远无法销毁它(有人可以验证如果这是真的吗?)。例如,如果我的树有一个destroy函数,如果没有用{RedBlackTree创建,我将无法释放从malloc内的结构分配的内存。 1}}或calloc对吧?

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

2 个答案:

答案 0 :(得分:4)

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

相反,具有自动存储功能的对象(如第二个示例中所示)仅存在于其声明的范围内,并且必须在其他位置复制以使其存活。

因此,这可以帮助您选择哪种更适合特定情况。

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

答案 1 :(得分:-4)

首先使用typedef会更好。它更容易。

如果你动态创建一个对象,你需要释放对象的每个成员。或者,内存泄漏。

如果它是一个大结构,当你返回它时,它会创建一个临时对象。它的成本更高。所以我更喜欢指针! 并忘记我之前说的话。我只是梦游。