【发布时间】:2016-08-24 14:42:12
【问题描述】:
我只是想再次检查以下是否完全正常且值得赞赏的改进:
如果我有:
struct ll_Node
{
void *data;
struct ll_Node *next, *prev;
};
我有构造函数:
static struct ll_Node* ll_Node_new(void *data)
{
struct ll_Node *node = calloc(1, sizeof(struct ll_Node));
if (node == NULL)
exit(EXIT_FAILURE);
node->data = data;
return node;
}
在上面的代码 sn-p 中,我想确保将 previous 变量设置为 NULL。我听说在内存中使用calloc 默认变量为0,这在C 中与NULL 完全相同。
所以代替:
struct ll_Node *node = malloc(sizeof(struct ll_Node));
我愿意
struct ll_Node *node = calloc(1, sizeof(struct ll_Node));
我问这个是因为calloc 似乎在数组 中非常受欢迎,因为如果您将malloc 用于数组,每个项目中都会包含垃圾数据.在第一个参数槽中使用calloc 和1 是否被认为是错误编码?
微小的子问题:如果我使用calloc 的东西是NULL 可以接受的,是否正在退出程序?或者这有点极端?我认为如果没有剩余内存来创建结构,那么显然我的程序继续运行的任何希望都将被放弃。
【问题讨论】:
-
空指针可能不会将所有位都设置为零,因此如果您正在编写可移植代码,那么 calloc 就是一个陷阱。
-
@LPs 既然程序已经快要终止了,为什么还要手动释放内存呢?无论如何,操作系统都会这样做。
-
OT:编码
struct ll_Node *node = calloc(1, sizeof *node);更健壮。 -
@bolov 你假设一个,让我说,hi-level 操作系统。我没有;)
-
即使
malloc或calloc没有错误,您打算如何删除/插入/查找节点、清除整个列表等?每个链接链接的实现都应该有这些函数调用;您已经必须跟踪您创建的每个节点,或者您在做什么?那么如果malloc出错了,你想清理退出,应该像delete_list(); exit(errCode);一样简单
标签: c memory-management malloc