2009-03-06 15 views
2

Ich benutze eine Struktur und ich möchte maximal 10 Ports initialisieren. Wenn das Programm ausgeführt wird, kann es jedoch viel weniger sein, wir wissen es erst zur Laufzeit. Dies wird jedoch die max. Ich habe struct nie zuvor so gemacht, wie ich normalerweise dynamisch unter Verwendung von Calloc und Delcare wie diese * Ports als Werttyp zuteile.struct c dynamisch Speicher zuweisen

Aber ich kann nicht verstehen, diese

*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 Punktoperator mit einem Pfeiloperator verwende? Ports [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; 
} 

normalerweise das, was ich in den vergangen getan haben, ist dies:

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

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

Und dann mit einem der unten folgenden zuweisen. Der vorherige Programmierer hat jedoch alles, was ich oben angezeigt habe, deklariert, so dass ich nichts ändern kann.

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

Vielen Dank für Ihre Anregungen,

+0

Kompilier gcc C99 – ant2009

Antwort

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

Ja, du bist ein Array von zehn Zeigern machen

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

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

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

dh. Sie legen den ersten Zeiger so fest, dass er auf genügend Speicher für zwei Ports verweist.

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

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

nicht genug upvote kann. Die Verwendung der dynamischen Zuweisung für etwas so pittoreskes wie 10 port_t unnötigerweise Code zu kompliziert. – jdizzle

7

Ihr erster Codeblock

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

der Zeiger ein Array hat. Dies bedeutet später, wenn Sie

ports[0]->port_id 

verwenden, Sie den ersten Zeiger im Array dereferenzieren. Es gibt auch etwas Hässlichkeit um die Größe von dem, was Sie eigentlich anrufen. Sie ersetzen Ihr Array von 10 durch ein Array von 2. Was Sie dort haben, ist in der Regel hässlich 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 die Variable Array-Deklaration.

Der Trick besteht darin, dass es, da es auf dem Stapel ist, nur von dieser Funktion und jeder von ihr aufgerufenen Funktion gültig ist. Sobald Sie von dieser Funktion zurückkehren, ist es natürlich frei.

2

Ports ist und Array von Zeigern Objekte port_t, so von Häfen tun [0] Sie einen Zeiger erhalten, kein Objekt, und Sie müssen es für den Zugriff mit ->

Zupacken eine gute Ressource auf Zeiger in C und lies es von vorne bis hinten. Es gibt auch Anleitungen zum Lesen von C-Erklärungen. Sie werden dieses Thema nicht verstehen können, indem Sie Antworten auf zufällige Fragen erhalten.

Here ist ein Link lesenswert.