2017-08-23 4 views
1

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?

+2

'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

+1

ressemble à une faute de frappe 'struct node * next;' devrait être 'struct Node * next;' –

+1

Vous devriez utiliser la syntaxe 'new_node-> content' au lieu de' (* new_node) .content' –

Répondre

2

En raison d'une faute de frappe dans cette déclaration

struct Node {int content; struct node *next;}; 
     ^^^^      ^^^^ 

il y a deux types déclarés struct Node et struct node qui sont des types incompatibles. En ce qui concerne les fonctions, elles peuvent être définies plus simplement. Par exemple, la fonction push peut être déclarée de la manière suivante.

int push(struct Node **node, int i) 
{ 
    struct Node *new_node = malloc(sizeof(struct Node)); 
    int success = new_node != NULL; 

    if (success) 
    { 
     (*new_node).content = i; 
     (*new_node).next = *node; 
     *node = new_node; 
    } 

    return success; 
} 

De même, il est préférable de quitter le programme si la pile est vide. Vous devez également réécrire la fonction pop.

Par exemple, la fonction peut être déclarée comme

int pop(struct Node **node, int *i); 

Dans le cas où la pile est vide, la fonction retourne 0. Sinon, il renvoie 1 et dans l'expression *i la valeur du nœud.