2012-05-30 1 views
1

J'essaye d'allouer dynamiquement une structure globale dans c, mais quelque chose rend mon fichier c ne pouvant pas trouver la référence à la variable externe.C extern struct pointeur allocation dynamique

Le journal:

main.c:18: undefined reference to `gate_array' 

EXTERN.h

#ifndef EXTERN_H_ 
#define EXTERN_H_ 


typedef struct gate_struct { 
    int out; 
} gate; 

extern gate *gate_array; 


#endif /* EXTERN_H_ */ 

main.c:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include "extern.h" 

int main(int argc, char *argv[]){ 

    gate_array = (gate*) malloc (2* sizeof(gate)); 

    return 0; 
} 

Merci!

+0

où est la déclaration 'de gate_array'? – triclosan

Répondre

3

Il n'y a pas de définition de gate_array en raison de extern. Dans ce cas, vous pouvez simplement supprimer le qualificatif extern. Cependant, si extern.h était utilisé dans plusieurs unités de traduction (#include dans plusieurs fichiers .c), cette approche entraînerait plusieurs erreurs de définition. Envisagez d'ajouter un autre fichier .c qui contiendrait la définition de gate_array (et toutes les variables futures), en veillant à ce qu'il y ait exactement une définition de gate_array. Le extern gate *gate_array indique au compilateur qu'il existe une variable appelée gate_array, mais elle est définie ailleurs. Mais il n'y a pas de définition de gate_array dans le code affiché.


, vous pouvez également lire Do I cast the result of malloc?

+0

A juste enlevé le qualificateur externe et le problème a été résolu. :) Merci! Vous ne voyez toujours pas pourquoi vous dites qu'il n'y a pas de définition de gate_array car c'est une structure "gate" qui est définie ci-dessus ... –

0

C'est probablement ce que vous vouliez faire:

#ifndef EXTERN_H_ 
#define EXTERN_H_ 


typedef struct gate_struct { 
    int out; 
} gate; 

typedef gate *gate_array; 


#endif /* EXTERN_H_ */ 

Ce typedefsgate * à gate_array. Ensuite, dans votre main.c que vous voulez faire:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include "extern.h" 

int main(int argc, char *argv[]){ 

    gate_array name_of_array = malloc (2* sizeof(gate)); 
    free(name_of_array); 

    return 0; 
} 

Auparavant, vous étaient portés disparus un nom de variable. En outre, il s'agit de bad practice to cast the return of malloc.

0

pointeur à la porte à savoir gate_array typedef n'a pas été déclaré que vous étiez en train de faire quelque chose comme ceci:

typedef int *IXX; 
IXX = (int*) malloc(2*sizeof(int)); 

quelque chose comme ça:

IXX ix = (int*) malloc(2*sizeof(int));