¿Qué hace [20]? Qué significa eso?
Los comentarios a continuación muestran una nomenclatura común para las partes de su estructura :
struct Person { //struct name (Person)
char name[50]; // \
int citNo; // --struct members
float salary; // /
} prsn[20]; // instance of struct Person array
El [20]indica que esta instancia de struct Persones una matriz de 20 colecciones separadas de los 3 miembros. Se puede acceder a cada elemento de la matriz mediante la notación de matriz. Por ejemplo, en un bucle:
int main(int argc, char *argv[])
{
for(int i=0;i<20;i++)// note i goes from 0 to 19
{
//.....
//assuming members have been populated
printf( "%d)\nName is: %d\ncitNo is: %d salary is: %f\n\n", prsn[i].name, prsn[i].citNo, prsn[i].salary);
}
return 0;
}
¿El [20] limita el nombre a 20 (de 50) o limita el prsnde prsn[1]a prsn[20]?
El miembro name[50]define una matriz de 50 caracteres. Su tamaño no se ve afectado de ninguna manera por el [20]índice utilizado para dimensionar la matriz de estructura. es decir, como lo tienes define, hay 20 casos de prsn, cada instancia que contiene 3 miembros: char [50], inty float. Y según su definición, las 20 instancias creadas por el [20]permiten acceder a la matriz con valores de índice de a 0través 19. (Consulte la ilustración del bucle anterior).
EDITAR para abordar la pregunta OP en los comentarios:
¿Y qué tengo que hacer si quiero que los elementos sean ilimitados?
Si desea utilizar los corchetes de matriz vacíos, ( []) la definición debe incluir una lista de inicializador de estructura . Por ejemplo:
... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};
Si el tamaño de la matriz de estructura no se conoce en el momento de la compilación, y debe dimensionarse de acuerdo con la información disponible solo en el tiempo de ejecución, se puede utilizar la asignación de memoria dinámica o un VLA . Primero, para la memoria dinámica, en lugar de definir con notación de matriz, cree una instancia de puntero:
... } *prsn;
Luego, en una función, use calloco mallocpara crear memoria por ejemplo 1000 instancias:
int someFunction(void)
{
prsn = calloc(1000, sizeof(struct Person));
if(prsn)
{
// Use instances of prsn
// free when finished
free(prsn);
}
Para VLA, las instancias creadas deben tener alcance local. Entonces, dentro de una función en alguna parte, haga esto:
int someFunction(int sizeOfStruct)
{
struct Person newPerson[sizeOfStruct] = {0};
Tenga en cuenta que este método no requiere liberar memoria asociada con newPerson
20elementos de tipostruct Person