Frage

Ich verwende eine Struktur, und ich möchte ein Maximum von 10 Ports initialisieren. Wenn jedoch das Programm läuft es viel weniger sein könnte, wissen wir nicht erst zur Laufzeit. Dies wird jedoch der max. Ich habe noch nie struct wie dies geschehen, da ich normalerweise dynamisch mit calloc zuweisen und wie diese * Ports als Wert Typ delcare.

Aber ich kann das nicht verstehen

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

Und

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

Sieht aus wie ich einen einzelnen Zeiger bin Zuteilung, die auf dem freien Speicher zugeordnet 2-Port-Objekte verweist?

Ich kann nicht verstehen, warum ich einen Punkt-Operator mit einem Pfeil Operator verwenden? Häfen [0] -> port_id = 20; printf ( "port_id:% d \ n", Häfen [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;
}

normalerweise, was ich in der vergangen getan habe, ist dies:

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

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

Und dann mit einer der folgenden unten zuordnen. Allerdings hat der vorherigen Programmierer erklärt alles wie ich oben angezeigt haben, so kann ich nichts ändern.

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

Vielen Dank für Ihre Anregungen,

War es hilfreich?

Lösung

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

Ja, Sie machen ein Array von zehn Zeigern

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

... aber diese Linie ist Unsinn. Es ist das gleiche wie folgt aus:

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

dh. Sie richten den ersten Zeiger für zwei Ports, um genügend Speicher zu zeigen.

Für ein so kleines Ding wäre es viel mehr Sinn machen, zehn Häfen, aber nicht nutzen sie alle:

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

Andere Tipps

Ihr erster Codeblock

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

, die ein Array von Zeigern. Dies bedeutet, später, wenn Sie verwenden

ports[0]->port_id

Sie sind dereferencing den ersten Zeiger im Array. Es gibt auch einige Hässlichkeit die Größe der Umgebung, was Sie calloc'ing tatsächlich. Sie tatsächlich Ihr Array von 10 mit einer Reihe von 2. zu ersetzen, was Sie haben es in der Regel hässlich ist und fehleranfällig.

Ich glaube, Ihre Absichten sind mehr entlang der Linien von:

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

Da Sie C99 verwenden, könnten Sie vermeiden calloc () / malloc (), , wenn Sie wirklich wollen, von C99 Variablen Array-Deklaration verwendet wird.

port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;

Der Trick ist, dass, da es auf dem Stapel ist, sie aus dieser Funktion ist nur gültig ist, und jede Funktion, indem du es genannt. Sobald Sie von dieser Funktion zurückkehren, ist es natürlich befreit.

Ports und Array von Zeigern auf Objekte port_t, so, indem Sie Ports [0] Sie einen Zeiger zu erhalten, kein Objekt, und Sie zugreifen müssen, um es mit ->

Schnappen Sie sich eine gute Ressource auf Zeiger in C und es von Anfang bis Ende lesen. Es gibt auch Tutorials zu C-Deklarationen zu lesen. Sie werden dieses Thema nicht, indem sie Antworten auf zufällige Fragen der Lage sein, zu verstehen.

Hier ist ein Link lesenswert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top