struct c dynamisk tildele minne

stemmer
2

Jeg bruker en struct og jeg ønsker å initialisere maksimalt 10 porter. Men når programmet er i gang kan det være mye mindre, vet vi ikke før kjøring. Dette vil imidlertid være maks. Jeg har aldri gjort struct som dette før, som jeg vanligvis dynamisk tildele hjelp calloc og delcare som dette * porter som verditype.

Men jeg kan ikke forstå dette

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

Og

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

Ser ut som jeg er tildeling av en enkelt peker som peker til 2 port gjenstander tildelt på free butikken?

Jeg kan ikke forstå hvorfor jeg bruker en prikk operatør med en pil operatør? porter [0] -> port_id = 20; printf ( port_id:% d \ n, havner [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;
}

normalt, hva jeg har gjort i pass er dette:

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

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

Og tilordne deretter med ett av følgende under. Imidlertid har den tidligere programmerer erklært alt som jeg har vist øverst så jeg kan ikke endre noe.

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

Mange takk for alle forslag,

Publisert på 06/03/2009 klokken 18:14
kilden bruker
På andre språk...                            


3 svar

stemmer
7

Din første kodeblokk har

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

som er en rekke pekere. Dette betyr senere når du bruker

ports[0]->port_id

du dereferencing det første peker i rekken. Det er også noen stygghet rundt størrelsen på hva du faktisk calloc'ing. Du faktisk erstatte rekke 10 med en rekke 2. Hva du har det generelt stygg og feiling utsatt.

Jeg tror dine intensjoner er mer i retning av:

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

Siden du bruker C99, kan du unngå calloc () / malloc (), hvis du virkelig ønsker å ved hjelp av C99 variable rekke erklæring.

port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;

Trikset er at siden det er på stakken, er det kun gyldig fra at funksjon og en funksjon kalt ved det. Når du kommer tilbake fra den funksjonen, er det selvsagt frigjort.

Svarte 06/03/2009 kl. 18:41
kilden bruker

stemmer
6

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

Ja, du gjør en rekke ti tips

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

... men denne linjen er tull. Det er det samme som denne:

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

dvs. Du setter den første pekeren å peke på nok minne for to porter.

For en så liten ting ville det være mye mer fornuftig å gjøre ti porter, men ikke bruke dem 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;
}
Svarte 06/03/2009 kl. 18:50
kilden bruker

stemmer
2

porter er og rekke pekere til port_t objekter, så ved å gjøre havner [0] får du en peker, ikke et objekt, og du trenger tilgang til den med ->

Ta en god ressurs på pekere i C og lese den fra perm til perm. Det er også tutorials på lesing C erklæringer. Du vil ikke være i stand til å forstå dette emnet ved å få svar på tilfeldige spørsmål.

Her finnes en link verdt å lese.

Svarte 06/03/2009 kl. 18:45
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more