Error de comstackción: con solicitud no se estructura algo o error de unión

En este progtwig, estoy tratando de crear una estructura y luego inicializar una matriz con ese tipo de estructura, poner nombre y edades en la matriz e imprimir los resultados. Sin embargo, cuando compilo el archivo, dice que “nombres” y edades “no son una estructura o unión algo. ¿Alguien puede detectar mis errores? Gracias.

#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); } } 

Usted declara p como una matriz de puntero a la estructura. En la línea de printf, desreferencia una vez p con p[i] , pero p sigue siendo un puntero a una estructura, desea acceder a sus campos con ->

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

Y a medida que incrementas i en tu bucle for, no necesitas mover el puntero p [i], eliminar, p[i] = p[i + 1]

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

person *p[7] declara una matriz de siete punteros a person , por lo que p[i] es un puntero a estructura. Por lo tanto, debe desreferenciar este puntero para acceder a sus miembros.

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

Para mejorar la legibilidad, puede utilizar el operador de postfix -> .

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

C11 (1570), § 6.5.2.3 Estructura y sindicalistas
Una expresión de posfijo seguida por el operador -> y un identificador designa a un miembro de una estructura u objeto de unión. El valor es el del miembro nombrado del objeto al que apunta la primera expresión, y es un lvalue) Si la primera expresión es un puntero a un tipo calificado, el resultado tiene la versión calificada del tipo del miembro designado. .