Elementos de matriz de estructura y miembros de estructura

8

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?

abw1904
fuente
3
Son lo mismo: ambos declaran una serie de 20elementos de tipostruct Person
LP
Es como, int prsn[20];excepto con struct Person en lugar de int
MM

Respuestas:

8

¿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

ryyker
fuente
Aunque para un número ilimitado de Personas, el OP podría utilizar mejor una lista vinculada, o quizás una serie de punteros a Persona, especialmente si el número de Personas puede cambiar durante el tiempo de ejecución. De lo contrario, pasará mucho tiempo copiando los miembros existentes, ya sea manualmente o mediante una llamada a realloc.
jamesqf
9

Las dos piezas de código anteriores son equivalentes.

En el primero, define struct Persony define prsncomo 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 del namemiembro, que es una matriz de 50 elementos. Tiene una matriz de 20 struct Person, cada una de las cuales contiene una matriz de 50 elementos de charllamada name.

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.

dbush
fuente
1
Entonces eso significa una serie de prsn [0] a prsn [19] ¿verdad? ¿Y qué tengo que hacer si quiero que los elementos sean ilimitados? prsn [n] o prsn [] o solo prsn?
abw1904
2
@ abw1904 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.
dbush
1
@ abw1904 Para codificar una "matriz de tamaño variable" debería echar un vistazo a Linked-List. Obviamente no será ilimitado, pero puede crecer en tiempo de ejecución
LP
1

Está declarando una matriz de 20 estructuras de ese tipo

Amante de las matemáticas
fuente
0

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 vez prsncomienza con 0 a 19. Puede consultar este sitio web para Estructura en C

Nikhil Kumar
fuente
1
Cuando se vincula a un sitio externo, debe revelar cualquier afiliación en sus respuestas o corren el riesgo de ser marcados como spam. Tómese el tiempo para leer Cómo no ser un spammer . Para el caso, probablemente sea una buena idea hacer el recorrido también.
David Buck hace