2010-09-11 5 views
0

gcc 4.4.4 c89allocation de mémoire pour une structure

Je ne cesse d'obtenir un "Impossible de déréférencer un type incomplet". Cependant, je suis sûr que mon type de structure est complet. Je renvoie l'instance Network_t qui est le pointeur vers la mémoire allouée. Je devrais être capable de déréférencer cette mémoire.

Un grand merci pour tous les conseils,

J'ai dans mon fichier d'en-tête: driver.h

typedef struct Network_t Network_t; 
Network_t* create_network(int id); 

fichier de mise en œuvre driver.c

#include "driver.h" 

struct Network_t { 
    int id; 
}; 

Network_t* create_network(int id) 
{ 
    Network_t *network = malloc(sizeof *network); 

    if(network) { 
     network->id = id; 
    } 
    return network; 
} 

Et dans ma principale .c

#include "driver.h" 

Network_t *network = NULL; 
network = create_network(1); 
printf("Network ID: [ %d ]\n", network->id); /* Cannot dereference pointer to incomplete type */ 
+0

S'il vous plaît assurez-vous de coller le code qui _exactement_ vous utilisez, pas un re-type. 'driver.c' ne peut pas compiler car il n'y a pas de'; 'après' network-> id = id'. Cela me fait douter du reste du code. J'assume que vous avez coupé les lignes '# include ', sinon vous auriez probablement des messages d'erreur différents. –

+0

J'ai corrigé ces fichiers d'inclusion. Merci. – ant2009

Répondre

10

À partir de main.c vous avez seulement une déclaration avant de struct Network_t visible. Pour accéder à id à partir d'un pointeur vers struct Network_t, vous avez besoin d'une définition de la structure visible à l'endroit où vous la dérérez. Vous pouvez déplacer la définition de driver.c à driver.h.

+0

Je voudrais cacher la définition de la structure. C'est pourquoi je ne l'ai pas mis dans le fichier d'en-tête. Y at-il de toute façon que je pourrais encore faire ceci sans déplacer ma définition de structure à driver.h? Merci. – ant2009

+2

Vous pouvez fournir une fonction pour accéder au membre 'id'. –

+0

@robUK: Vous pouvez écrire la définition 'struct Network_t' dans le fichier .c ou utiliser un fichier .h privé (driver-private.h) pour cela. – pmg

0

celui-ci fonctionne

dans driver.h

#include <stdio.h> 
#include<stdlib.h> 
struct Network_t{ 

    int id; 

}; 
Network_t *create_network(int id){ 
    Network_t *network=(Network_t *)malloc(sizeof(network)); 

    if (network){ 
     network->id=id; 
    } 
     return network; 

} 

dans Network.cpp

#include <iostream> 
#include "driver.h" 
using namespace std; 
int main(){ 

    Network_t *network=NULL; 
    network=create_network(1); 
    printf("Network ID:[%d]\n",network->id); 
    return 0; 
} 

Résultat:

Network ID:[1] 
+2

La publication d'origine n'est pas étiquetée 'C++'. Dans 'C' il est ** très ** inhabituel d'avoir du code dans les fichiers d'en-tête. – pmg