2009-03-06 9 views
2

J'utilise une structure et je veux initialiser un maximum de 10 ports. Cependant, lorsque le programme est en cours d'exécution, il peut être beaucoup moins, nous ne savons pas avant l'exécution. Cependant, ce sera le maximum. Je n'ai jamais fait de struct comme ça avant, car normalement j'alloue dynamiquement en utilisant calloc et delcare comme ce * ports comme type de valeur.struct c allouer dynamiquement de la mémoire

Cependant, je ne comprends pas ce

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

Et

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

On dirait que je suis un seul pointeur allouons qui pointe vers 2 objets ports attribués au magasin libre?

Je n'arrive pas à comprendre pourquoi j'utilise un opérateur de point avec un opérateur de flèche? ports [0] -> port_id = 20; Printf ("port_id:% d \ n", ports [0] -> id_port)

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

normalement, ce que je l'ai fait dans le passé est la suivante:

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

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

Et puis attribuez-lui avec une des conditions suivantes ci-dessous. Cependant, le programmeur précédent a déclaré tout ce que j'ai affiché en haut, donc je ne peux rien changer.

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

Un grand merci pour toutes les suggestions,

+0

C99 gcc compilier – ant2009

Répondre

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

Oui, vous faites un tableau de dix pointeurs

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

... mais cette ligne est un non-sens. C'est la même chose que ceci:

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

ie. Vous définissez le premier pointeur pour pointer sur assez de mémoire pour deux ports.

Pour une petite chose telle qu'il serait beaucoup plus logique de faire dix ports, mais pas tous les utiliser:

#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

peut pas assez Upvote. Utiliser l'allocation dynamique pour quelque chose d'aussi piquant que 10 ports_t surchargea inutilement le code. – jdizzle

7

Votre premier bloc de code a

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

qui est un tableau de pointeurs. Cela signifie plus tard lorsque vous utilisez

ports[0]->port_id 

vous déréférencement le premier pointeur dans le tableau. Il y a aussi une certaine laideur autour de la taille de ce que vous appelez réellement. Vous êtes en train de remplacer votre tableau de 10 avec un tableau de 2. Ce que vous avez là est généralement moche et sujettes aux erreurs.

Je crois que vos intentions sont plus le long des lignes 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; 
} 

Puisque vous utilisez C99, vous pouvez éviter calloc()/malloc(), si vous voulez vraiment en utilisant la variable C99 déclaration de tableau.

port_t array_on_mains_stack[some_runtime_port_count]; 
ports = array_on_mains_stack; 

L'astuce, il est que depuis qu'il est sur la pile, il est uniquement valable à partir de cette fonction et une fonction appelée par elle. Une fois que vous revenez de cette fonction, il est bien sûr libéré.

2

ports est et tableau de pointeurs vers port_t objets, donc par les ports faisant [0] vous obtenez un pointeur, pas un objet, et vous devez y accéder avec ->

Faire une bonne ressource sur les pointeurs en C et lisez-le de la couverture à la couverture. Il y a aussi des tutoriels sur la lecture des déclarations C. Vous ne serez pas en mesure de comprendre ce sujet en obtenant des réponses à des questions aléatoires.

Here est un lien qui mérite d'être lu.

Questions connexes