struct node* new_node =
(struct node*) malloc(sizeof(struct node));
ここの * がわかりません:...(struct node*) malloc(siz...
まず、* は node または malloc に属しますか? どういう意味ですか?ポインタはどのようにしてメモリ関数 malloc と関係があるのでしょうか? * 場所に本当に混乱している
ありがとう
C言語の括弧内( など)の型名を(struct node *)
「キャスト」と呼びます。これは、式の型を名前付きの型に変更する方法であり、一般的にポインターで使用されます。
ただし、これはmalloc の結果をキャストしますかのアドバイスを無視するコードです。ここではキャストは必要ないため、これは (私の意見では、リンクをたどっていればそれほど驚くことではないかもしれませんが) かなり悪いコードになっています。
この割り当てを記述する最良の方法は次のとおりです。
struct node * new_node = malloc(sizeof *new_node);
これは型を一度だけ言及し、エラーを引き起こす可能性があり、無意味で読むのが面倒なキャストを削除し、割り当てるメモリ量を指定する際の脆弱性の導入を回避します。ウィン、ウィンウィンです。
struct node <= type
*new_node <= pointer named new_node (of type struct node)
= <= assignment
(struct node *) <= cast to pointer of type struct node
malloc(SIZE) <= returns pointer of type void, thus needs cast
(struct node*)
これは明示的な型変換です。は*
に属しstruct node
、要求された型がstruct node
変数へのポインタであることを示しています。malloc() は常にvoid*
void ポインタを返します。
malloc の関数定義はvoid* malloc (size_t size);
(その場合も に*
属しvoid
ます)。
あなたの質問に投稿されたコードを書いた人は、この void ポインターを にキャストしましたstruct node*
。彼らがこれを行った理由は明らかではありません。彼らは、C のポインター キャストがどのように機能するかについて混乱しており、そのようなキャストの危険性を認識していなかったか、またはコードが C++ 用に記述されていたためです。
C 言語の void ポインターは、キャストなしで他のポインター型に変換できる汎用ポインター型です (1)。
ただし、C++ では、void ポインターを変換するときに常にキャストする必要があります。これは、C++ には C よりも厳密な型変換規則があり、明示的な変換が強制されるためです。
C で malloc() の結果をキャストすることは危険であり、バグ (2) と見なされます。これは、正しい関数プロトタイプが #include によって提供されない限り、コンパイラの既定の動作が開始され、malloc が int を返すと誤って信じてしまうためです。特定のシステムのポインターと整数の幅によっては、問題なく動作する場合もあれば、プログラムがクラッシュしたり、メモリ リークが発生したりする場合もあります。
ただし、C++ で malloc() の結果をキャストする必要があります。
参考文献:
はタイプ*
用です。ここでの型は a ( a へのポインター) です。struct node*
struct node
malloc
関数に「接続」されているのではなく、型に「接続」されています。はmalloc()
ポインターを返すため、戻り値もポインターとして割り当てます。
単なる型キャストです。実際には、 malloc 関数は void ポインター (void *) を返します。つまり、データ構造やデータ型に固有のものではありません。汎用ポインタを返します。型キャストにより、戻り値を特定のものにします。この場合 (struct node *) は、構造体のノード型へのポインターです。
簡単に言うと、void ポインター (void *) を構造体ポインター (struct node *) に変換していると言えます。