2012-05-30 4 views
1

Я пытаюсь динамически распределить глобальную структуру в c, но что-то заставляет мой c-файл не найти ссылку на внешнюю переменную.C extern struct pointer dynamic allocation

Журнал:

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

Спасибо!

+0

где находится 'gate_array' декларация? – triclosan

ответ

3

Не существует определения gate_array из-за extern. В этом случае вы можете просто удалить квалификатор extern. Однако, если extern.h был использован в нескольких единицах перевода (#include в нескольких файлах .c), тогда этот подход приведет к многочисленным ошибкам определения. Подумайте о добавлении еще одного файла .c, который будет содержать определение gate_array (и любые будущие переменные), гарантируя, что существует только одно определение gate_array.

extern gate *gate_array сообщает компилятору, что существует переменная с именем gate_array, но она определена где-то в другом месте. Но нет определения gate_array в опубликованном коде.


Кроме того, вы можете прочитать Do I cast the result of malloc?

+0

Просто удалил квалификатор extern, и проблема была решена. :) Благодаря! Все еще не понимаю, почему вы говорите, что нет определения gate_array, поскольку это структура «gate», которая определена выше ... –

0

Это, вероятно, что вы имели в виду сделать:

#ifndef EXTERN_H_ 
#define EXTERN_H_ 


typedef struct gate_struct { 
    int out; 
} gate; 

typedef gate *gate_array; 


#endif /* EXTERN_H_ */ 

Это typedefsgate * к gate_array. Затем в main.c вы хотите сделать:

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

Ранее вы отсутствовали имя переменной. Кроме того, это bad practice to cast the return of malloc.

0

Указатель на воротах т.е. gate_array был ЬурейеЕ не объявлен, так что вы делали что-то вроде этого:

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

ли что-то вроде этого:

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