辛抱強く言ったようにmalloc()
、C でのリターンをケースに入れないでください。そうすることは役に立たず、エラーを隠す可能性があります。
また、Node ヘッダーに続くアドレスを計算するには、次のようにする方がクリーンだと思います。
t->data = t + 1;
これt
は型付きポインターであるため機能するため、算術演算は正常に機能します。1 を追加すると、ポイント先のデータのサイズだけインクリメントされます。つまりsizeof (Node)
、この場合です。この特定のケースでは、この使用法が慣用的であることがわかります。これは、 ed の直後のアドレスを計算することですmalloc()
(その「何か」が、Node
この場合の構造体のように、静的に既知のサイズを持つ明確に定義された型である場合)。
これには次の利点があります。
- 型名の重複はありません。
- いいえ
sizeof
、とても短いです。
- 繰り返しますが、キャストはいません。
- 非常に単純な算術が含まれ、読みやすい。
Node
タイプが適切に宣言される前に、タイプの使用にエラーがあることに気付きました。私はdirkgentlyの解決策に同意しません。これがCでどのように見えるかです:
/* This introduces the type name "Node", as an alias for an undefined struct. */
typedef struct Node Node;
struct Node {
Node *next; /* This is OK, the compiler only needs to know size of pointer. */
void *data;
};
完全を期すために、また、このようなコードをどのように記述すべきかを説明することに飽きることがないので、n バイトのデータを保持する新しいノードを作成する関数の例を次に示します。
Node * node_new(size_t n)
{
Node *node;
if((node = malloc(sizeof *node + n)) != NULL)
{
node->next = NULL;
node->data = node + 1;
}
return node;
}
それでおしまい。sizeof
呼び出しでのポインター ターゲットでの使用に注意しmalloc()
てください。これは、型が変更された場合に型名を繰り返し、忘れやすい依存関係を作成しないようにするためです。