gpt4 book ai didi

c - 如何让 gcc 警告未定义的结构?

转载 作者:太空狗 更新时间:2023-10-29 16:27:22 24 4
gpt4 key购买 nike

我在 .h 中定义了一个结构

struct buf_stats {
// ***
};

然后在.c文件中

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

buf_states 是错字。

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

这个错误/打字错误让我花了 3 个小时才找到。

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

最佳答案

在你的代码中

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

错误的原因有很多,比如

  • 您正在使用未定义的类型(如您所述)
  • 您正在分配更少的内存(分配给类型指针而不是类型)

但是对于这种特殊类型的错误,您的编译器在 _this_case 中无能为力,因为

  • 指向平台中(任何)类型的指针具有定义的大小,因为结构(即它指向的变量的类型)不需要是完整的( 定义)。这就是我们可以拥有自引用结构的原因,对吧?

  • 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的类型时不需要任何修改。

关于c - 如何让 gcc 警告未定义的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46049552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com