我在.h
中定义了一个结构struct buf_stats {
// ***
};
然后在.c文件
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
其中buf_states
是拼写错误。
但gcc并没有警告我,尽管我使用了-Wall
这个错误/打字错误花了我3个小时才发现。
如何让gcc像这样警告未定义的结构?
答案 0 :(得分:36)
在您的代码中
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
有很多原因,例如
但是对于这种特殊类型的错误,你的编译器在_this_case中帮不了多,如
平台中指向(任何)类型的指针具有已定义的大小,因为该结构(即它指向的变量的类型)不需要完整( 定义)。这就是我们可以拥有自引用结构的原因,对吗?
malloc()
不知道目标变量类型。它只读取所需大小的参数,将指针(类型为void *
)返回到已分配的内存,并在赋值时将其更改为目标类型。它无法使用分配的内存大小计算目标大小(类型)中的不匹配。
避免这些类型错误的最方便和最简单的方法是,不要直接使用硬编码类型作为sizeof
的操作数,而是使用变量引用。< / p>
像
这样的东西 struct buf_stats *bs = malloc(sizeof *bs) ; // you can write that as (sizeof (*bs)) also
// sizeof *bs === sizeof (struct buf_stats)
相当于
struct buf_stats *bs = malloc(sizeof(struct buf_stats)) ;
但更强大,更不容易出错。
注意:
bs
的类型时,此语句不需要任何修改。答案 1 :(得分:17)
你做不到。使用类似struct foo *
的表达式(指向某种结构类型的指针)将该结构声明为不完整类型。大小未知,但指针的大小不是必需的。
也就是说,代码看起来不对,因为你需要结构的大小(不是指针的大小),所以使用以下代码:
struct buf_stats *bs = malloc(sizeof(struct buf_states));
您会收到错误。
有一种更好的方式来编写这样的代码:
struct buf_stats *bs = malloc(sizeof *bs);
表达式*bs
具有sizeof
的正确类型,即使您稍后更改了类型。