在 C 中编写函数时,哪些因素决定了函数返回结果的方式?我的问题来自阅读以下代码,该代码在双向链表中创建了一个节点,并且来自本书:
typedef struct DLLIST
{
    uint16 tag;                 /* This node's object type tag */
    struct DLLIST *next;
    struct DLLIST *previous;
    void *object;
    uint32 size;                /* This node's object size */
} DLLIST;
DLLIST *dlCreate(uint16 tag, void *object, uint32 size)
{
    DLLIST *newNode;
    newNode = malloc(sizeof(*newNode));
    if (newNode != NULL)
    {
        newNode->previous = NULL;
        newNode->next = NULL;
        newNode->tag = tag;
        newNode->size = size;
        newNode->object = malloc(size);
        if (newNode->object != NULL)
        {
            memcpy(newNode->object, object, size);
        }
        else
        {
            free(newNode);
            newNode = NULL;
        }
    }
    return newNode;
}
事实上,作为初学者,我发现这个函数的许多方面令人困惑:
- 为什么 DLLIST 指针以这种方式返回,而不是作为引用指针传递并修改?如果你这样做了,你可以释放返回值以用作报告函数成功/失败的状态字节。
 - 为什么不测试第二个参数以确保指针不为 NULL?将 NULL 指针传递给 memcpy 肯定是一件非常糟糕的事情吗?
 
此外,强制模块中的所有函数使用相同的调用约定是常见的做法吗?例如,从上面的函数中提取的双向链表模块中的所有函数都应该符合status byte = function(argument list)吗?此外,验证所有值可能不正确的函数参数是否普遍?例如,检查所有指针值以确保它们不为空?