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 prsn
de 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]
, int
e 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 0
meio 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 calloc
ou malloc
para 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
20
elementos do tipostruct Person