3

本では、mallocの構文はmalloc(sizeof(int))であると読みましたが、二重にリンクされたリストプログラムの1つでは、次のように表示されます。

newnode=(struct node *)malloc(sizeof(struct node))

ここで(struct node *)は何をしていますか?このコード全体は何をしていますか?ところで、プログラムの構造体のコードは次のとおりです。

struct node
{
char line[80];
struct node *next,*prev;
};

struct node *start=NULL,*temp,*temp1,*temp2,*newnode;

ありがとうございました

4

5 に答える 5

5

このコードはpointer、 を単一タイプの に動的に作成していstruct nodeます。C のほとんどのバージョンでは、(struct node *)キャストは必要なく、使用すべきではないと主張する人もいます。キャストを外すと になり、void*どの型にも使用できます。

したがって:

newnode = (struct node*)malloc(sizeof(struct node));

以下とほぼ同等です。

newnode = malloc(sizeof(struct node));

参照:具体的には、malloc の結果をキャストすることの何が危険ですか?

注 1: Visual Studio を使用して C コードを記述している場合、 の結果をキャストしないと赤い下線が引かれますmalloc。ただし、コードは引き続きコンパイルされます。

注 2: mallocC++ コードで使用するには、例に示すように結果をキャストする必要があります。

于 2013-03-21T17:05:56.020 に答える
3

非常に悪いコードに遭遇しました。C プログラマーは、 の結果を決してキャストしませんmalloc()。必要ないだけでなく、害を及ぼす可能性があります

于 2013-03-21T17:05:00.470 に答える
2

malloc割り当てたいバイト数を引数として渡す必要があります。そのため、このコード サンプルでは、​​struct ノード変数に必要なバイト数を割り当てるためにsizeof(struct node)Tellingを使用しています。Cちなみに、このコードに示されているような結果をキャストするのは悪い考えです。

于 2013-03-21T17:05:45.673 に答える
2

malloc は void ポインタを返します。

(struct node*) は、void ポインターからターゲット ポインター型への明示的な変換を行います。

于 2013-03-21T17:06:01.763 に答える
1

"malloc" は void ポインターを返します。(struct node *) は、malloc の結果を「ノード構造体ポインター」に型キャストしています。これは (間違いなく) 「newnode」です。

于 2013-03-21T17:05:27.953 に答える