【问题标题】:What is the point of creating an array of a size of 1?创建一个大小为 1 的数组有什么意义?
【发布时间】:2014-12-08 14:53:15
【问题描述】:

我见过一些创建结构的 C 代码,并且在结构内有许多数组。其中一些数组的大小为 1。那么为什么要麻烦把它做成一个数组呢?为什么不只是一个int?

我说的是这样的事情:

struct Foo
{

uint8_t Bar[1];
uint32_t BigBar[4];


};

为什么不直接做呢

struct Foo
{

uint8_t Bar;
uint32_t BigBar[4];

};

【问题讨论】:

  • 如果数组位于结构的末尾,它可能是flexible array members
  • 也许这个问题已经在这里回答了 SO stackoverflow.com/questions/6390331/…
  • @Shansingh 那是完全不同的东西。
  • 如果提供了一些上下文,这可能是一个有趣的问题(程序员这样做可能有很多原因,也许她/他只是喜欢这种风格)。目前它无法回答,应该关闭。
  • @HuStmpHrrr 我在问它是否写成#define ONE 1 然后uint8_t Bar[ONE];

标签: c


【解决方案1】:

答案是,这样做是一种良好的编程习惯,原因有二:

  1. 如果程序员决定在某个时候将 Bar 更改为数组,则无需进行大量代码更改。所需要做的就是将常量从 1 更改为 ARRAY_SIZE(最好将常量实际定义为 1)

  2. 使用构造相同的字段比使用不同的字段更不容易出错。会思考的程序员是会犯错误的人:)

干杯

【讨论】:

    【解决方案2】:

    我的猜测是更容易返回指针:

    返回指向变量的指针会更容易:Bar

    如果你想将它用作指针,你可以传递 Bar 而不是 &Bar 如果它是一个 int

    如果我定义了结构的实例: struct Foo aaa;

    你可以定义:

    int *pInt = aaaa.Bar;
    

    代替:

    int *pInt = &(aaaa.Bar);
    

    【讨论】:

    • 那为什么不使用uint8_t *呢?
    • @Philipp,这个想法是数组衰减到我相信的指针。所以你可以返回foo->Bar 而不是&foo->Bar。不过,这是否是一种好的做法是另一回事......
    • 它没有返回一个指针。它设置了一个要发送的 uint8_t 值。
    • 然而,我同意你关于能够返回 Foo->Bar 的观点,即使这看起来是一个很奇怪的原因,能够省略 & 符号! ;)
    【解决方案3】:

    与其他结构的一致性?

    struct alien {
        int heads[3];
        ...
    };
    
    struct human {
        int heads[1];
        ...
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 2012-06-28
      • 2019-05-01
      • 2013-01-19
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多