2010-09-11 7 views
0

gcc 4.4.4 c89Распределение памяти для конструкции

Я продолжаю получать «Невозможно разыменовать неполный тип».

Однако, я уверен, что у меня есть полный тип структуры. Я возвращаю экземпляр Network_t, который является указателем на выделенную память. Я должен уметь разыгрывать эту память.

Большое спасибо за любые советы,

У меня есть это в моем файле заголовка: driver.h

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

файла Реализация 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; 
} 

И в моей основной .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

Пожалуйста, убедитесь, что вы вставляете _exactly_ код, который вы используете, а не повторный тип. 'driver.c' не может компилятор, так как нет'; 'после' network-> id = id'. Это заставляет меня сомневаться в остальной части кода. Я _assume_, что вы вырезали строки '# include', иначе у вас, вероятно, были бы разные сообщения об ошибках. –

+0

Я исправил те включенные файлы. Благодарю. – ant2009

ответ

10

От main.c у вас есть только передняя декларация struct Network_t видна. Чтобы получить доступ к id от указателя до struct Network_t, вам нужно определить структуру, которая будет видна в точке, где вы ее разыскиваете.

Вы можете переместить определение от driver.c до driver.h.

+0

Я хотел бы скрыть определение структуры. Вот почему я не поместил его в заголовочный файл. В любом случае, я все еще мог это сделать, не меняя определение структуры на driver.h? Благодарю. – ant2009

+2

Вы можете предоставить функцию доступа к элементу 'id'. –

+0

@robUK: Вы можете написать определение 'struct Network_t' в .c файле или использовать для него частный файл .h (driver-private.h). – pmg

0

это работает

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

} 

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

результат:

Network ID:[1] 
+2

Оригинал сообщения не помечен 'C++'. В 'C' ** очень ** необычно иметь код в заголовочных файлах. – pmg

Смежные вопросы