¿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 Person
es 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 prsn
de 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]
, int
y 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 0
travé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 calloc
o malloc
para 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
20
elementos de tipostruct Person