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

*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,

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top