Quiero preguntar sobre una declaración de estructura en C. Por ejemplo,
struct Person
{
char name[50];
int citNo;
float salary;
} prsn[20];
¿Qué [20]hacer? Qué significa eso? ¿Limita el nombre a 20 (de 50) o limita el prsnde prsn[1]a prsn[20]?
Y si escribo el código así:
struct Person
{
char name[50];
int citNo;
float salary;
};
struct Person prsn[20];
¿Hace lo mismo?

20elementos de tipostruct Personint prsn[20];excepto con struct Person en lugar de intRespuestas:
Los comentarios a continuación muestran una nomenclatura común para las partes de su estructura :
El
[20]indica que esta instancia destruct 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: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 deprsn, cada instancia que contiene 3 miembros:char [50],intyfloat. Y según su definición, las 20 instancias creadas por el[20]permiten acceder a la matriz con valores de índice de a0través19. (Consulte la ilustración del bucle anterior).EDITAR para abordar la pregunta OP en los comentarios:
Si desea utilizar los corchetes de matriz vacíos, (
[]) la definición debe incluir una lista de inicializador de estructura . Por ejemplo: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:
Luego, en una función, use
callocomallocpara crear memoria por ejemplo 1000 instancias:Para VLA, las instancias creadas deben tener alcance local. Entonces, dentro de una función en alguna parte, haga esto:
Tenga en cuenta que este método no requiere liberar memoria asociada con
newPersonfuente
Las dos piezas de código anteriores son equivalentes.
En el primero, define
struct Persony defineprsncomo una matriz de 20 elementos de esa estructura al mismo tiempo. En el segundo, primero define la estructura y luego define por separado la matriz.En C, los índices de matriz comienzan en 0, por lo que en ambos casos la
prsnmatriz contiene elementos indexados de 0 a 19. Esto no afecta el tamaño delnamemiembro, que es una matriz de 50 elementos. Tiene una matriz de 20struct Person, cada una de las cuales contiene una matriz de 50 elementos decharllamadaname.En cuanto a lo que el tamaño de la matriz ilimitada, una matriz debe tener un tamaño, ya sea explícitamente especificado entre
[y]o implícitamente a través de una lista de inicialización. El tamaño puede ser una variable, sin embargo, dicha matriz no se puede definir en el alcance del archivo, y la variable de tamaño debe tener asignado un valor previamente.fuente
[y]o implícitamente a través de una lista de inicialización. El tamaño puede ser una variable, sin embargo, dicha matriz no se puede definir en el alcance del archivo, y la variable de tamaño debe tener asignado un valor previamente.Está declarando una matriz de 20 estructuras de ese tipo
fuente
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. En C, los índices de matriz comienzan en 0, por lo que cada vezprsncomienza con 0 a 19. Puede consultar este sitio web para Estructura en Cfuente