我目前正在使用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
}
struct RedBlackTree RedBlackTree_new()
{
struct RedBlackTree tree;
tree.root = NULL;
tree.size = 0;
return tree;
}
我的意思是,如果我做了第二个选项,那么我经常不得不使用&
将它作为指针传递给我的函数,据我所知,在我的程序结束之前我永远无法销毁它(有人可以验证如果这是真的吗?)。例如,如果我的树有一个destroy
函数,如果没有用{RedBlackTree
创建,我将无法释放从malloc
内的结构分配的内存。 1}}或calloc
对吧?
同样在一般情况下,两者的优点和缺点是什么?我总是可以使用*
从指针中检索数据,并且我总是可以使用&
将数据转换为指针,因此在某种意义上它几乎感觉它们完全可以互换。
答案 0 :(得分:4)
真正的区别在于对象的生命周期。通过动态分配(malloc
/ calloc
和free
)在堆上分配的对象会一直存在,直到它被明确释放。
相反,具有自动存储功能的对象(如第二个示例中所示)仅存在于其声明的范围内,并且必须在其他位置复制以使其存活。
因此,这可以帮助您选择哪种更适合特定情况。
从效率的角度来看,动态分配更加昂贵并且需要额外的间接性,但允许您传递指针,这可以防止数据被复制,因此在其他情况下可以更有效,例如。当对象很大并且副本很昂贵时。
答案 1 :(得分:-4)
首先使用typedef会更好。它更容易。
如果你动态创建一个对象,你需要释放对象的每个成员。或者,内存泄漏。
如果它是一个大结构,当你返回它时,它会创建一个临时对象。它的成本更高。所以我更喜欢指针! 并忘记我之前说的话。我只是梦游。