如何让gcc警告undefined结构?

时间:2017-09-05 07:45:22

标签: c pointers gcc sizeof gcc-warning

我在.h

中定义了一个结构
struct buf_stats {
   // ***
};

然后在.c文件

struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;

其中buf_states是拼写错误。

但gcc并没有警告我,尽管我使用了-Wall

这个错误/打字错误花了我3个小时才发现。

如何让gcc像这样警告未定义的结构?

2 个答案:

答案 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)) ;

但更强大,更不容易出错。

注意:

  1. 如果操作数不是类型名称,则不需要括号。
  2. 在更改目标变量bs的类型时,此语句不需要任何修改。

答案 1 :(得分:17)

你做不到。使用类似struct foo *的表达式(指向某种结构类型的指针)将该结构声明为不完整类型。大小未知,但指针的大小不是必需的。

也就是说,代码看起来不对,因为你需要结构的大小不是指针的大小),所以使用以下代码:

struct buf_stats *bs = malloc(sizeof(struct buf_states));

您会收到错误

有一种更好的方式来编写这样的代码:

struct buf_stats *bs = malloc(sizeof *bs);

表达式*bs具有sizeof的正确类型,即使您稍后更改了类型。