2010-09-11 113 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'后没有';'。这让我怀疑代码的其余部分。我想你已经把'#include'行切碎了,否则你可能会得到不同的错误信息。 – 2010-09-11 16:38:39

+0

我已更正这些包含文件。谢谢。 – ant2009 2010-09-11 16:47:40

回答

10

main.c您只能看到struct Network_t的前向声明。要从指针访问idstruct Network_t,您需要定义一个结构,使其在取消引用的位置可见。

您可以将定义从driver.c移动到driver.h

+0

我想隐藏结构的定义。这就是为什么我没有把它放在头文件中。无论如何,我仍然可以做到这一点,而无需将我的结构定义移动到driver.h中?谢谢。 – ant2009 2010-09-11 16:50:30

+2

你可以提供一个函数来访问'id'成员。 – 2010-09-11 16:58:26

+0

@robUK:您可以在.c文件中写入'struct Network_t'定义,或使用私有的.h文件(driver-private.h)。 – pmg 2010-09-11 17:29:14

0

这一个在Network.cpp工作

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

} 

#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

Original Post未标记'C++'。在'C'中,在头文件中有代码是非常不寻常的。 – pmg 2010-09-11 17:26:16