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 でないことを確認するために 2 番目の引数がテストされないのはなぜですか? 確かに memcpy に NULL ポインターを渡すのは非常に悪いことでしょうか?
さらに、モジュール内のすべての関数に同じ呼び出し規約を使用するよう強制するのは一般的な方法ですか? たとえば、上記の関数の取得元である双方向リスト モジュール内のすべての関数は、以下に準拠する必要がありstatus byte = function(argument list)
ますか? さらに、値が正しくない可能性があるすべての関数引数を検証するのは一般的な方法ですか? たとえば、すべてのポインター値をチェックして、null でないことを確認しますか?