Elementos da matriz dos membros struct e struct

8

Eu quero perguntar sobre uma declaração struct em C. Por exemplo,

struct Person
{
    char name[50];
    int citNo;
    float salary;
} prsn[20];

O que [20]faz? O que isso significa? Limita o nome a 20 (de 50) ou limita prsnde de prsn[1]a prsn[20]?

E se eu escrever o código assim:

struct Person
{
    char name[50];
    int citNo;
    float salary;
};
struct Person prsn[20];

Faz a mesma coisa?

abw1904
fonte
3
Eles são os mesmos: ambos declaram uma matriz de 20elementos do tipostruct Person
LPs
É como int prsn[20];exceto com Pessoa struct em vez de int
MM

Respostas:

8

O que faz [20]? O que isso significa?

Os comentários abaixo mostram uma nomenclatura comum para as partes da sua estrutura :

struct Person {    //struct name (Person)
    char name[50]; // \
    int citNo;     //  --struct members 
    float salary;  // /
} prsn[20];        // instance of struct Person array

A [20]indica que esta instância do struct Personé uma matriz de 20 recolha selectiva das 3 membros. Cada elemento da matriz pode ser acessado usando a notação de matriz. Por exemplo, em um loop:

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;
}

O [20] limita o nome a 20 (de 50) ou limita o prsnde prsn[1]a prsn[20]?

O membro name[50]define uma matriz de 50 caracteres. Seu tamanho não é afetado de forma alguma pelo [20]índice usado para dimensionar a matriz de struct. ou seja, que tenha ela definido, existem 20 casos de prsn, cada exemplo contendo 3 membros: char [50], inte float. E por sua definição, as 20 instâncias criadas pelo [20]permite que a matriz a ser acessado com valores de índice de 0meio 19. (Veja a ilustração do loop acima.)

EDIT para abordar a questão do OP nos comentários:

E o que devo fazer se quiser tornar os elementos ilimitados?

Se você deseja usar os colchetes vazios da matriz, ( []) a definição deve incluir uma lista de inicializadores de estrutura . Por exemplo:

... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};  

Se o tamanho da matriz struct não for conhecido no tempo de compilação e precisar ser dimensionado de acordo com as informações disponíveis apenas no tempo de execução, poderá ser usada a alocação dinâmica de memória ou um VLA . Primeiro, para memória dinâmica, em vez de definir com notação de matriz, crie uma instância de ponteiro:

... } *prsn;  

Em uma função, use callocou mallocpara criar memória para, por exemplo, 1000 instâncias:

int someFunction(void)
{
    prsn = calloc(1000, sizeof(struct Person));
    if(prsn)
    {
        // Use instances of prsn
        // free when finished
        free(prsn);
    }

Para o VLA, as instâncias criadas devem ter escopo local. Então, dentro de uma função em algum lugar, faça o seguinte:

int someFunction(int sizeOfStruct)
{
    struct Person newPerson[sizeOfStruct] = {0};

Observe que este método não requer liberar memória associada ao newPerson

ryyker
fonte
Embora para um número ilimitado de pessoas, o OP pode fazer melhor ao usar uma lista vinculada ou talvez uma matriz de indicadores para a pessoa, especialmente se o número de pessoas puder mudar durante o tempo de execução. Caso contrário, você gastará muito tempo copiando os membros existentes, manualmente ou por meio de um calll para realloc.
Jamesqf 11/12/19
9

Os dois pedaços de código acima são equivalentes.

No primeiro, você define struct Persone define prsncomo uma matriz de 20 elementos dessa estrutura ao mesmo tempo. No segundo, você primeiro define a estrutura e depois define separadamente a matriz.

Em C, os índices da matriz começam em 0; portanto, nos dois casos, a prsnmatriz contém elementos indexados de 0 a 19. Isso não afeta o tamanho do namemembro, que é uma matriz de 50 elementos. Você tem uma matriz de 20 struct Person, cada uma das quais contém uma matriz de 50 elementos charchamada name.

Com relação a tornar o tamanho da matriz ilimitado, uma matriz deve ter um tamanho, especificado explicitamente entre [e ]ou implicitamente por meio de uma lista de inicializadores. O tamanho pode ser uma variável, no entanto, essa matriz não pode ser definida no escopo do arquivo e a variável size deve ter sido atribuída um valor anteriormente.

dbush
fonte
1
Então isso significa uma matriz de prsn [0] a prsn [19], certo? E o que tenho que fazer se quiser tornar os elementos ilimitados? prsn [n] ou prsn [] ou apenas prsn?
abw1904
2
@ abw1904 Uma matriz deve ter um tamanho, especificado explicitamente entre [e ]ou implicitamente por meio de uma lista de inicializadores. O tamanho pode ser uma variável, no entanto, essa matriz não pode ser definida no escopo do arquivo e a variável size deve ter sido atribuída um valor anteriormente.
dbush
1
@ abw1904 Para codificar uma "matriz de tamanho variável", você deve dar uma olhada na Linked-List. Obviamente não será ilimitado, mas pode crescer em tempo de execução
LPs
1

Você está declarando uma matriz de 20 estruturas desse tipo

Math Lover
fonte
0

O [20] indica que esta instância de struct Personé uma matriz de 20 coleções separadas dos 3 membros. Cada elemento da matriz pode ser acessado usando a notação de matriz. Em C, os índices de matriz começam em 0, portanto, toda vez que prsncomeça de 0 a 19. Você pode conferir este site em Estrutura em C

Nikhil Kumar
fonte
1
Ao criar um link para um site externo, você deve divulgar qualquer afiliação em suas respostas ou elas correm o risco de serem sinalizadas como spam. Por favor, reserve um tempo para ler Como não ser um spammer . Por falar nisso, provavelmente é uma boa ideia fazer o passeio também.
David Buck