Pregunta

Estoy usando una estructura y quiero inicializar un máximo de 10 puertos. Sin embargo, cuando el programa se está ejecutando podría ser mucho menos, no lo sabemos hasta el tiempo de ejecución. Sin embargo, este será el máximo. Nunca he hecho una estructura como esta antes, ya que normalmente asigno dinámicamente usando calloc y delcare como este * los puertos como el tipo de valor.

Sin embargo, no puedo entender esto

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

Y

*ports = (struct port_t*) calloc(2, sizeof(*ports)); 

Parece que estoy asignando un único puntero que apunta a 2 objetos de puerto asignados en el almacén gratuito?

No entiendo por qué estoy usando un operador de puntos con un operador de flecha. puertos [0] - > port_id = 20; printf (" port_id:% d \ n " ;, ports [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, lo que he hecho en el pasado es esto:

struct port_t
{
    int port_id;
    char name;
} *ports;

ports = (struct port_t*) calloc(2, sizeof(*ports));

Y luego asignar con cualquiera de los siguientes a continuación. Sin embargo, el programador anterior ha declarado todo lo que he mostrado en la parte superior, por lo que no puedo cambiar nada.

ports[0].port_id = 10;
ports->port_id = 10;

Muchas gracias por cualquier sugerencia,

¿Fue útil?

Solución

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

Sí, estás haciendo una serie de diez punteros

*ports = (struct port_t*) calloc(2, sizeof(*ports));

... pero esta línea no tiene sentido. Es lo mismo que esto:

ports[0] = (struct port_t*) calloc(2, sizeof(port_t));

es decir. Está configurando el primer puntero para apuntar a memoria suficiente para dos puertos.

Para algo tan pequeño tendría mucho más sentido hacer diez puertos pero no usarlos 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;
}

Otros consejos

Tu primer bloque de código tiene

struct port_t
{
    int port_id;
    char name;
} *ports[MAX_PORTS];

que es una matriz de punteros. Esto significa más tarde cuando usas

ports[0]->port_id

estás eliminando la referencia del primer puntero de la matriz. También hay algo de fealdad en torno al tamaño de lo que en realidad llamas. En realidad, estás reemplazando tu matriz de 10 con una matriz de 2. Lo que tienes allí es generalmente feo y propenso a errores.

Creo que tus intenciones están más en línea con:

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

Ya que estás usando C99, podrías evitar calloc () / malloc (), si realmente quieres usando la declaración de matriz de variables de C99.

port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;

El truco es que, dado que está en la pila, solo es válido desde esa función y desde cualquier función que llame. Una vez que regresa de esa función, por supuesto se libera.

ports es y un conjunto de punteros a objetos port_t, por lo que al hacer puertos [0] obtienes un puntero, no un objeto, y necesitas acceder a él con - >

Agarra un buen recurso en punteros en C y léelo de principio a fin. También hay tutoriales sobre la lectura de las declaraciones C. No podrá comprender este tema obteniendo respuestas a preguntas aleatorias.

Aquí es un enlace que vale la pena leer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top