2010-09-10 138 views
0

gcc 4.4.4 c89解引用指向不完整类型的指针

不知道为什么我得到此错误。

在我的头文件我有以下

handle.h

typedef struct Handle_t Handle 

我在执行文件

handle.c

struct Handle { 
    size_t id; 
    char *name; 
}; 

Handle* create_handle(size_t id) 
{ 
    Handle *hdev = NULL; 
    hdev = malloc(sizeof(*hdev)); /* Error */ 
    . 
    . 
} 

非常感谢您的任何建议,

+0

我不认为这就是为什么你会得到错误,但是你想使用sizeof(Handle),而不是sizeof(* hdev)。取消引用hdev是取消引用空指针。 – 2010-09-10 17:20:22

+0

@Merlyn:'sizeof * hdev'是正确的(就像'sizeof(Handle)')一样。 'sizeof'运算符不计算参数,因此NULL是不重要的。 – pmg 2010-09-10 17:25:00

+0

@Merlyn Morgan-Graham:恰恰相反。你想特别使用'sizeof * hdev',而不是'sizeof(Handle)'。结果在两种情况下都是相同的,但'sizeof * hdev'是一种更好的编程习惯,因为它使代码更独立于类型。当然,这里没有空指针问题,因为'sizeof'不会评估这个参数。 – AnT 2010-09-10 17:39:36

回答

6

我用来获取typedef错误往往直到我开始想它像两个部分:高清类型首先,然后def inition的一个新名称。

typedef <type> <name>; 
typedef struct Handle Handle_t; /* defines Handle_t as struct Handle */ 
typedef char *c_string;   /* defines c_string as char * */ 
+1

+1约typedefing记忆 – teukkam 2010-09-10 17:23:33

+0

只是一个令人困惑的事情。 typedef struct Handle Handle_t。 '结构句柄'部分是类型。 Handle_t是定义。所以这个结构实际上叫做Handle_t。这是正确的吗?谢谢。 – ant2009 2010-09-10 17:37:38

2

你的结构的名称需要匹配的typedef:

struct Handle_t { 
    /* ... */ 
}; 
1
typedef struct Handle_t Handle 

你定义的结构被称为Handle,不Handle_t,这是你typedeffing什么。

1

typedef结构为handle_t拉手

键入定义结构为handle_t到手柄,但该结构STRUCT手柄,所以无论是改变结构Hadle到结构为handle_t或DEF键入。

1

struct Handle_t不是由编译器到达与错误的行的时间来定义。

您已经定义了一个struct Handle并将类型Handle设置为不存在的类型struct Handle_t。在C中有许多不存在的类型可以使用,但不适用于sizeof参数。

相关问题