2009-11-06 6 views
0

Je compile ce morceau de code et j'obtiens des erreurs de compilation en disant "pointeur de déréférencement vers un type incomplet". Je reçois les erreurs pour la dernière instruction d'impression et avant cela où j'essaie de pointer (* temp). num à l'adresse de bQuestion concernant la référence de la structure des pointeurs

void main() 
{ 

    struct { 
     int xx; 
     char *y; 
     int * num; 
     struct x *next; 
    }x; 

    struct x* temp; 
    int b = 10; 

    temp = ((struct x *)malloc(sizeof(x))); 

    (*temp).num = &b; 

    x.next = temp ; 

    printf(" %d\n",temp->num, x.next->num); 

} 
+1

'main()' retourne un entier. Pour rendre votre programme plus portable utilisation 'int main (void) {/ * ... * /}'. Et vous n'avez pas besoin de convertir la valeur de retour de 'malloc()', il vaut mieux '#include '. Et '(* temp) .num' peut être écrit' temp-> num' – pmg

+1

Oh. .. et votre 'printf' attend 1 argument en dehors de la chaîne de format et vous le passez 2. – pmg

+1

Vous ne devriez pas convertir la valeur de retour de malloc(), en C. – unwind

Répondre

5

Le problème est que la déclaration:

struct { 
    ... 
} x; 

définit une instance sans nom 'x' - pas un type nommé 'x'. Lorsque vous faites référence à 'struct x' depuis l'intérieur, tout le compilateur sait que vous voulez un pointeur de type 'x' - que vous définirez plus tard (et vous ne le ferez jamais).

Pour définir un type nommé 'x' dont vous avez besoin:

struct x { 
    ... 
}; 
+0

Cela ne définit pas un type nommé 'x' - c'est juste une balise struct. Pour définir un type nommé, vous aurez besoin d'un typedef. – Draemon

+0

@Draemon - Partiellement vrai - il définit une structure nommée 'x' ... En C droit, vous ne pouvez pas utiliser 'x' sans la partie 'struct' mais il est toujours nommé par opposition à OP quand il n'était pas nommé. – Aaron

+1

@Aaron: Il définit une structure nommée "struct x", pas un type qui est une structure nommée "x". Struct balises et les noms de type sont distincts namespaces, en C. – unwind

0

Je pense que vous vouliez dire:

struct x { 
    int xx; 
    char *y; 
    int * num; 
    struct x *next; 
}x; 

Vous désignez un "tag struct" que vous n'avez pas défini où vous utilisez struct x. Vous n'avez aucun moyen de vous référer au type de variable x. Puisque vous voulez vous y référer avec struct x, vous devez définir la balise struct.

0

Je pense que c'est le fait que votre structure se réfère à elle-même avant qu'elle ne soit complètement définie.

En particulier, votre structure n'a pas de nom; "x" est le nom d'une variable ayant une telle structure, mais il n'y a pas de nom de type.

Il suffit de déclarer "struct x { ... } x" et ça devrait aller.

0

Outre ce Draemon écrire sur struct x {...} x, je me suis permis de corriger les divers autres petits problèmes comme le printf():

void main() 
{ 
    struct x { 
    int xx; 
    char *y; 
    int *num; 
    struct x *next; 
    } x; 
    struct x* temp; 
    int b = 10; 
    temp = ((struct x *)malloc(sizeof(struct x))); 
    (*temp).num = &b; 
    x.next = temp ; 
    printf("%d %d\n",*temp->num, *x.next->num); 
} 

Juste par curiosité: Qu'est-ce que vous essayez d'atteindre?

0

Veuillez noter que void main() n'a jamais été un prototype valide pour main en C ou C++.

Si vous voulez pointer sur le struct vous déclarez dans le struct, vous devez marquer le struct. Le typedef est parfois utile, mais pas nécessaire.

Veuillez étudier les différences entre votre code et ce qui suit et comprendre pourquoi les différences sont là. Cela vous aidera à apprendre. Il en va de la lecture C FAQ list (voir par exemple Structures, Unions, and Enumerations.

#include<stdio.h> 
#include<stdlib.h> 

int main(void) { 
    int b = 10; 

    typedef struct x_struct { 
     int xx; 
     char *y; 
     int *num; 
     struct x_struct *next; 
    } x; 

    x *temp = malloc(sizeof(*temp)); 
    if (!temp) { 
     return EXIT_FAILURE; 
    } 

    temp->num = &b; 
    temp->next = temp; 

    printf("%d %d\n", *(temp->num), *(temp->next->num)); 
    return 0; 
} 
+0

Salut, Dans votre code, vous vouliez dire x_struct temp * = malloc .. au lieu de x * temp = malloc ... S'il vous plaît préciser . Aussi, si vous pouvez regarder le commentaire que j'ai ajouté en haut (pour la question) résumant ma compréhension. Si vous pouvez jeter un coup d'oeil rapide, ce sera génial Merci. – user193891

+0

Je voulais dire 'x * temp = malloc (...)'. 'struct x * temp' aurait aussi bien fonctionné. Cependant, pourquoi ne pas utiliser le 'typedef' maintenant que nous l'avons typé? –

Questions connexes