struct c alocar dinamicamente a memória
Pergunta
Eu estou usando uma struct e eu quero inicializar um máximo de 10 portas. No entanto, quando o programa está em execução poderia ser muito menos, não sabemos até run-time. No entanto, este será o máximo. Eu nunca fiz struct como este antes, como eu alocar normalmente dinamicamente usando calloc e delcare como este portos * como o tipo de valor.
No entanto, eu não consigo entender esta ??p>
*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?
E
*ports = (struct port_t*) calloc(2, sizeof(*ports));
Parece que eu estou alocando um único ponteiro que aponta para 2 porta objetos alocados na loja livre?
Eu não posso entender por que eu estou usando um operador ponto com um operador de seta? portos [0] -> port_id = 20; printf ( "port_id:% d \ n", portas [0] -> port_id);
#include <stdio.h>
#include <stdlib.h>
#define MAX_PORTS 10
struct port_t
{
int port_id;
char name;
} *ports[MAX_PORTS];
int main(void)
{
*ports = (struct port_t*) calloc(2, sizeof(*ports));
ports[0]->port_id = 20;
printf("port_id: %d\n", ports[0]->port_id);
return 0;
}
Normalmente, o que eu fiz no passado é o seguinte:
struct port_t
{
int port_id;
char name;
} *ports;
ports = (struct port_t*) calloc(2, sizeof(*ports));
e depois atribuir com um dos seguintes procedimentos abaixo. No entanto, o programador anterior declarou tudo como se eu tivesse exibido na parte superior, então não posso mudar nada.
ports[0].port_id = 10;
ports->port_id = 10;
Muito obrigado por todas as sugestões,
Solução
*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?
Sim, você está fazendo uma matriz de ponteiros dez
*ports = (struct port_t*) calloc(2, sizeof(*ports));
... mas esta linha é um disparate. É o mesmo que isso:
ports[0] = (struct port_t*) calloc(2, sizeof(port_t));
ie. Você está definindo o primeiro ponteiro para apontar para memória suficiente para duas portas.
Para uma coisa tão pequena que faria muito mais sentido para fazer portos dez, mas não usá-los todos:
#define MAX_PORTS 10
struct port_t
{
int port_id;
char name;
} ports[MAX_PORTS];
/* number of ports in use */
int numPorts = 0;
int main(void)
{
numPorts = 3;
for (int i=0; i<numPorts; i++) {
ports[i].port_id = i;
printf("port_id %d: %d\n", i, ports[i].port_id);
}
return 0;
}
Outras dicas
Seu primeiro bloco de código tem
struct port_t
{
int port_id;
char name;
} *ports[MAX_PORTS];
que é uma matriz de ponteiros. Este meio mais tarde, quando você usa
ports[0]->port_id
você está dereferencing o primeiro ponteiro na matriz. Há também alguma feiúra em torno do tamanho do que você está realmente calloc'ing. Você está substituindo realmente o seu leque de 10 com um conjunto de 2. O que você tem aí é geralmente feio e propenso a erros.
Eu acredito que suas intenções são mais ao longo das linhas de:
struct port_t
{
int port_id;
char name;
} *ports;
int main(void)
{
*ports = (struct port_t*) calloc(2, sizeof(*ports));
ports[0].port_id = 20;
printf("port_id: %d\n", ports[0].port_id);
return 0;
}
Uma vez que você estiver usando C99, você poderia evitar calloc () / malloc (), se você realmente quer usando declaração de matriz variável de C99.
port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;
O truque não é que desde que está na pilha, é válida apenas a partir dessa função e qualquer função chamada por ele. Uma vez que você retornar a partir dessa função, é claro que é libertado.
portas é e matriz de ponteiros para objetos port_t, por isso, portos fazendo [0] você tem um ponteiro, não um objeto, e você precisa acessá-lo com ->
Grab um bom recurso em ponteiros em C e lê-lo de capa a capa. Há também tutoriais sobre lendo declarações C. Você não será capaz de entender este tema, obtendo respostas às perguntas aleatórias.
Aqui de uma ligação vale a pena ler.