2009-03-09 8 views
0

C99 gccstructure calloc c

Je continue d'obtenir cette erreur. J'ai une structure en dehors du principal. Et à l'intérieur de la main, j'essaie d'allouer sur la pile en utilisant calloc. Je n'arrive pas à trouver ce qui ne va pas.

Merci pour tout conseil,

erreur: expression attendue avant «) » jeton

/* global */ 
struct port_data_t                  
{                      
    size_t task_id;                  
    pthread_t *thread_id;                
    size_t start_port;                 
    size_t number_ports;                 
} *port_data;                   


/* main function */ 
struct port_data_t *port_data = (struct task_data_t*) calloc(4, sizeof(port_data*)); 
+0

est-ce que vous utilisez un type différent de celui que vous attribuez à un autre type? –

+0

J'ai fait quelques changements. Doit être ceci: struct port_data_t * port_data = (struct port_data_t *) calloc (4, taille de (port_data *)); – ant2009

+0

Je pense que vous pourriez avoir besoin de poster le code entier (si pas trop long) –

Répondre

7

Doit être calloc(4, sizeof(*port_data)): Remarque * avant e nom var.

4

devrait être sizeof (port_data_t) non sizeof (port_data *). La première est la taille d'une structure port_data_t. Ce dernier ne veut rien dire.

+0

Je préfère utiliser * alloué, moins de casse si le type change. –

+0

Doit être sizeof (struct port_data_t), pas sizeof (port_data_t) sauf si je me trompe gravement. –

+0

Un pluser! Tuez le pluser païen! :) –

0

Comme le souligne Jeffamaphone, task_data_t est hors contexte. Et aussi souligné par Crashworks, essayez sizeof (port_data_t) si vous voulez un tableau de structures dans port_data. L'utilisation de sizeof (port_data *) lui permettra d'allouer sizeof au pointeur de port_data_t qui, dans la plupart des cas, n'est utile que dans la plupart des cas.

+0

Je suppose que vous vouliez dire' sizeof (port_data_t *) 'à la fin il ... –

+0

Non, il signifie sizeof (struct port_data_t). J'ai vérifié ceci avec GCC et cela ne fonctionne pas sans le mot-clé struct. –

+0

Trop de C++: '( –

1

Essayez de changer ceci:

struct port_data_t *port_data = (struct task_data_t*) calloc(4, sizeof(port_data*)); 

à ceci:

port_data = (struct port_data_t*) calloc(4, sizeof(*port_data)); 

pourrait fonctionner un peu mieux. Si vous avez déclaré port_data en tant que structure globale, vous n'avez pas besoin de le déclarer à nouveau comme struct port_data_t. GCC devrait déjà le savoir. Bien sûr, comme je le ferais est la suivante:

port_data = (struct port_data_t*) calloc(4, sizeof(struct port_data_t)); 

Mais je n'aime pas mettre des variables dans sizeof(). J'essaie de rester avec des types, juste par habitude. De plus, il résout toutes les ambiguïtés sur la façon exacte dont un pointeur doit être déréférencé, ce qui vous fait trébucher dans ce cas.

+0

Bien sûr, l'utilisation de la variable est beaucoup plus sûre lorsque vous changez le type de pointeur ... –

1
#include <malloc.h> 
#include <pthread.h> 

typedef struct port_data_t { 
    size_t task_id; 
    pthread_t *thread_id; 
    size_t start_port; 
    size_t number_ports; 
} port_data_t; 

port_data_t* f() { 
    port_data_t* ports = (port_data_t*)calloc(4, sizeof(port_data_t)); 
    return ports; 
} 
Questions connexes