J'ai implémenté une pile très basique ici en tant qu'exercice, en utilisant une liste chaînée.Pourquoi j'obtiens un avertissement de type pointeur incompatible ici?
Mon programme a les trois fichiers suivants.
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;
}
Quand je compile cela, cependant, je reçois les avertissements suivants
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;
^
Bien que le programme fonctionne malgré ces avertissements et donne la sortie correcte, mais je voudrais tout de même comprendre pourquoi ce qui se passe.
Pourquoi est-ce que je reçois ces avertissements? Et comment puis-je les réparer?
'Node' vs' node'. Soit dit en passant, n'utilisez pas les conversions pour contourner les erreurs car tout ce que cela fait c'est cacher les erreurs, pas les réparer. – interjay
ressemble à une faute de frappe 'struct node * next;' devrait être 'struct Node * next;' –
Vous devriez utiliser la syntaxe 'new_node-> content' au lieu de' (* new_node) .content' –