1
struct node {
int data;
struct node *next,*prev;
};
void insert(struct node *head,int data){
if(head == NULL){
head = (node *)malloc(sizeof(node));
 --- code continues-----

と の違いを知りたいだけ head = (node *)malloc(sizeof(node));で、関数のパラメーターとしてstruct node *head = malloc(sizeof(struct node)); 渡すとどうなりますか?**headinsert

4

5 に答える 5

3

違い:

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

つまり、C コンパイラは最初のものを拒否して 2 番目を許可しますが、C++ コンパイラは最初のものを受け入れ、2 番目のものを拒否します。

nodeC では、示されているコードは、 を定義または宣言するときに型名を作成しませんstruct nodetypedef struct node node;C ソースを追加する必要があります。nodeC++は、 の定義から型名を自動的に作成しますstruct nodevoid *(C++ コンパイラは、 からへの暗黙のキャストのために 2 番目を拒否しstruct node *ます。C++ ではそれが許可されず、 が必要になりますstruct node *head = (struct node *)malloc(sizeof(struct node));)

**head関数のパラメーターとして渡すとinsert、どうなりますか?

関数の本体を調整する必要がありますが、呼び出し元の関数でリストの先頭の位置を変更できます。

于 2013-06-05T17:48:11.353 に答える
2

最初の質問に対する答えは次のとおりです。

head=(node *)malloc(sizeof(node));

malloc()は型のポインターを返すvoidので、ここでは明示的に型のnodeポインターにvoid()変換しています。したがって、次のように書くと:

head=malloc(sizeof(node));

それでも正しく動作します。しかし、C++ コンパイラではそうではありません。C++ ではvoid、型のポインターは、割り当て先のポインターの型に暗黙的にキャストされません。

また、ご質問への回答として、

void insert(struct node *head,int data)

パラメータとして渡す**headと、演算子のタイプが一致しないことを宣言するエラーが表示されます。これは、struct node *headnot as として宣言したためですstruct node **head

于 2014-01-31T16:12:26.603 に答える
1

入力すると

typedef struct node{
    int data;
    struct node *next, *prev;
} node;

コンパイラはコードを受け入れますhead = (node *)malloc(sizeof(node));typedefC++ で使用されるのと同じ方法で構造体を使用できることを覚えておいてください。

于 2013-06-05T19:09:48.750 に答える
0

sizeof(node)技術的には、sizeof(struct node)(少なくとも C++ では)と の間に違いはありません。どちらも構造体のサイズを返すためです。

ただし、C では、 type がないという理由だけで、その型の変数を宣言するときstruct nodeに書き込むことが必須であるのと同じように、 を記述することが必須です。C は、プリミティブ ( ) と で宣言されたカスタム型のみを理解します。すべての C コンパイラはこのキーワードに非常に厳密であり、変数を忘れた場合は変数について話していると想定します。struct nodenodeint, char, longstructstruct

2番目の質問について:できません。キャストしない限り、通常のポインターのみを受け入れる関数へのポインターへのポインターを渡すことはできません。ただし、その場合、スタック上の完全に任意の位置 (ポインターが配置されている場所) を指し、おそらくプログラムがクラッシュします。

于 2013-06-05T17:48:40.833 に答える