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 prsn
de 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?
20
elementos de tipostruct Person
int 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 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: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]
,int
yfloat
. Y según su definición, las 20 instancias creadas por el[20]
permiten acceder a la matriz con valores de índice de a0
travé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
calloc
omalloc
para 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
newPerson
fuente
Las dos piezas de código anteriores son equivalentes.
En el primero, define
struct Person
y defineprsn
como 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
prsn
matriz contiene elementos indexados de 0 a 19. Esto no afecta el tamaño delname
miembro, que es una matriz de 50 elementos. Tiene una matriz de 20struct Person
, cada una de las cuales contiene una matriz de 50 elementos dechar
llamadaname
.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 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. En C, los índices de matriz comienzan en 0, por lo que cada vezprsn
comienza con 0 a 19. Puede consultar este sitio web para Estructura en Cfuente