繁体   English   中英

C - Calloc而不是Malloc来保存线路?

[英]C - Calloc instead of Malloc to save lines?

我只是想仔细检查以下内容是否完全没问题且值得赞赏:

如果我有:

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;
}

在上面的代码片段中,我想确保将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用于数组,那么每个项目都会有垃圾数据。 在第一个参数槽中使用calloc1被认为编码不好吗?


微小的小问题:如果我使用calloc的东西是NULL可接受的,退出程序? 还是有点极端? 我认为如果没有剩余的内存来创建一个结构,那么显然我的程序继续运行的任何希望都是没收的。

你的问题的答案可能都归结为风格。

虽然你使用calloc是正确的,以确保分配的内存被清零,特别是在这样的情况下,你没有在构造节点时分配所有字段,我不喜欢你依靠calloc设置0而不是具体分配上一个和下一个NULL。 你必须考虑其他人(甚至你)6个月后阅读这段代码。 通过不明确地分配prev和next到NULL,代码的意图稍微不那么明确。

像这样的东西:

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;
    node->prev = node->next = NULL;
    return node;
}

向读者清楚地说明prev和next被初始化为NULL,并且调用者应确保将它们设置为正确的值。 代码的读取次数比写入的次数多很多,因此,为了使代码的意图明显,你可以做的任何事情都会减少阅读它的人的压力。

至于你的另一个问题,我同意评论者的意见,如果你的函数返回并且你在一个地方验证函数是否成功并且做任何通知(设置错误字符串/代码)和清理(释放)在一个地方需要干净的资源。

使用calloc(1, sz)是完全可以接受的,事实上最好是malloc(sz)然后是memset 请参阅此处以进一步阅读

但是,假设calloc生成空指针有点草率。 虽然在最流行的现代平台上也是如此,但过去曾有过(甚至可能仍然存在)平台,其中空指针具有其他一些位模式。

为了尽可能正确,最好是calloc然后显式地将任何指针设置为NULL 如果您在一个空指针实际上是全位 - 零的平台上,那么编译器将优化这些分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM