Erreur de compilation: avec requête, pas quelque chose de structure ou erreur d’union

Dans ce programme, j’essaie de créer une structure, puis d’initialiser un tableau avec ce type de structure, de mettre son nom et son âge dans le tableau, puis d’imprimer les résultats. Cependant, lorsque je comstack le fichier, il est indiqué que les “noms” et “âges” ne sont pas quelque chose de structure ou d’union. Quelqu’un peut-il repérer mes erreurs s’il vous plaît?

#include  #include  /* these arrays are just used to give the parameters to 'insert', to create the 'people' array */ char *names[7]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim", "Harriet"}; int ages[7]= {22, 24, 106, 6, 18, 32, 24}; /* declare your struct for a person here */ typedef struct{ char *names; int ages; } person; static void insert (person **p, char *s, int n) { *p = malloc(sizeof(person)); static int nextfreeplace = 0; /* put name and age into the next free place in the array parameter here */ (*p)->names=s; (*p)->ages=n; /* modify nextfreeplace here */ nextfreeplace++; } int main(int argc, char **argv) { /* declare the people array here */ person *p[7]; //insert the members and age into the unusage array. for (int i=0; i < 7; i++) { insert (&p[i], names[i], ages[i]); p[i]= p[i+1]; } /* print the people array here*/ for (int i=0; i < 7; i++) { printf("name: %s, age:%i\n", p[i].names, p[i].ages); } } 

vous déclarez p comme un tableau de pointeur sur la structure. Sur la ligne printf, vous déréférencez une fois p avec p[i] , mais p est toujours un pointeur sur une structure, vous souhaitez accéder à ses champs avec ->

 for (int i=0; i < 7; i++) { printf("name: %s, age:%i\n", p[i]->names, p[i]->ages); } 

Et comme vous incrémentez i dans votre boucle for, vous n’avez pas besoin de déplacer votre pointeur p [i], supprimez, p[i] = p[i + 1]

 for (int i=0; i < 7; i++) { insert (&p[i], names[i], ages[i]); } 

person *p[7] déclare un tableau de sept pointeurs sur person , donc p[i] est un pointeur sur la structure. Par conséquent, vous devez déréférencer ce pointeur pour accéder à ses membres.

 printf("name: %s, age:%i\n", (*p[i]).names, (*p[i]).ages); 

Pour améliorer la lisibilité, vous pouvez utiliser l’opérateur postfixe -> .

 printf("name: %s, age:%i\n", p[i]->names, p[i]->ages); 

C11 (1570), § 6.5.2.3 Structure et affiliés
Une expression postfixée suivie de l’opérateur -> et d’un identifiant désigne un membre d’une structure ou d’un object d’union. La valeur est celle du membre nommé de l’object sur lequel pointe la première expression et correspond à une valeur lvalue). Si la première expression est un pointeur sur un type qualifié, le résultat a la version qualifiée du type du membre désigné .