代码之家  ›  专栏  ›  技术社区  ›  Sato

如何使gcc警告未定义的结构?

  •  20
  • Sato  · 技术社区  · 7 年前

    struct buf_stats {
       // ***
    };
    

    然后进入。c文件

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

    buf_states 是一个拼写错误。

    -Wall

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

    2 回复  |  直到 7 年前
        1
  •  35
  •   Sourav Ghosh    7 年前

    在您的代码中

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

    有很多原因是错误的,比如

    • 您正在分配更少的内存(为 指向类型的指针 类型 )

    • 指向的指针( 任何 )平台中的类型具有定义的大小,因此结构(即它指向的变量类型)不需要完整( 定义

    • malloc() 不知道目标变量类型。它只读取所需大小的参数,返回指针(类型为 void * )分配给分配的内存,并在分配时更改为目标类型。它不可能计算 不匹配

    最方便最简单的方法 避免 这些类型的错误是,不要将硬编码类型直接用作 sizeof

    类似于

     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 .
        2
  •  17
  •   user2371524 user2371524    7 年前

    struct foo * 声明 不完整类型 指针

    结构的大小 ( 指针的大小),因此使用以下代码:

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

    你会得到一个 .

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

    *bs 具有正确的类型 sizeof ,即使以后更改类型。