在 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)
吗?此外,验证所有值可能不正确的函数参数是否普遍?例如,检查所有指针值以确保它们不为空?