1
ここでは、リンクリストを使用して、非常に基本的なスタックを練習問題として実装しました。ここで、互換性のないポインタ型の警告が表示されるのはなぜですか?
私のプログラムには、次の3つのファイルがあります。
stack.h
#ifndef STACK_H
#define STACK_H
#include <stdio.h>
struct Node {int content; struct node *next;};
void push(struct Node **node, int i);
int pop(struct Node **node);
#endif
stack.c
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
void push(struct Node **node, int i)
{
struct Node *new_node = malloc(sizeof(struct Node));
if (!(*node)){
(*new_node).content = i;
(*new_node).next = NULL;
*node = new_node;
return;
}
(*new_node).content = i;
(*new_node).next = (struct Node *)*node;
*node = new_node;
return;
}
int pop(struct Node **node)
{
if (*node == NULL){
printf("Stack is empty\n");
exit(EXIT_FAILURE);
}
struct Node *temp = (**node).next;
int i = (**node).content;
free(*node);
*node = temp;
return i;
}
main.cの
#include <stdio.h>
#include "stack.h"
struct Node *top = NULL;
int main(void)
{
push(&top, 2);
printf("%d\n\n", pop(&top));
return 0;
}
私はしかし、これをコンパイルすると、私が手次の警告
stack.c: In function ‘push’:
stack.c:18:19: warning: assignment from incompatible pointer type
(*new_node).next = (struct Node *)*node;
^
stack.c: In function ‘pop’:
stack.c:31:22: warning: initialization from incompatible pointer type
struct Node *temp = (**node).next;
^
プログラムは、これらの警告にもかかわらず、実行され、正しい出力が得られますが、私はまだこれが起こっている理由を理解したいと思いますけれども。
なぜこれらの警告が表示されますか?そして、どうすれば修正できますか? 2種類struct Node
と互換性のないタイプですstruct node
が宣言されている
struct Node {int content; struct node *next;};
^^^^ ^^^^
この宣言のタイプミスに
「ノード」対「ノード」。ところで、エラーを回避するためにキャストを使用しないでください。 – interjay
は、 'struct node * next;のように見えます。' struct Node * next; ' –
'(* new_node).content'の代わりに 'new_node-> content'構文を使用してください。 –