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 prsn
de 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?
20
elementos do tipostruct Person
int prsn[20];
exceto com Pessoa struct em vez de intRespostas:
Os comentários abaixo mostram uma nomenclatura comum para as partes da sua estrutura :
A
[20]
indica que esta instância dostruct 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: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 deprsn
, cada exemplo contendo 3 membros:char [50]
,int
efloat
. E por sua definição, as 20 instâncias criadas pelo[20]
permite que a matriz a ser acessado com valores de índice de0
meio19
. (Veja a ilustração do loop acima.)EDIT para abordar a questão do OP nos comentários:
Se você deseja usar os colchetes vazios da matriz, (
[]
) a definição deve incluir uma lista de inicializadores de estrutura . Por exemplo: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:
Em uma função, use
calloc
oumalloc
para criar memória para, por exemplo, 1000 instâncias: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:
Observe que este método não requer liberar memória associada ao
newPerson
fonte
Os dois pedaços de código acima são equivalentes.
No primeiro, você define
struct Person
e defineprsn
como 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
prsn
matriz contém elementos indexados de 0 a 19. Isso não afeta o tamanho doname
membro, que é uma matriz de 50 elementos. Você tem uma matriz de 20struct Person
, cada uma das quais contém uma matriz de 50 elementoschar
chamadaname
.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.fonte
[
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.Você está declarando uma matriz de 20 estruturas desse tipo
fonte
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 queprsn
começa de 0 a 19. Você pode conferir este site em Estrutura em Cfonte