无法在此C程序中一起理解数组和结构

时间:2018-08-14 06:44:39

标签: c

我试图了解下面的C程序,

Pair(it.chance, it.tier)

该程序可以使用gcc -Wall test进行编译。c

  1. 这里如何为每个结构成员分配值?
  2. 在这种情况下如何使用数组属性来证明输出的合理性?

PS

变量l和q仅用于缩短要在SO上询问的代码。实际上,这些是使用大型muxing宏的mux值。更改为“ a”和“ b”。

3 个答案:

答案 0 :(得分:4)

这是草率的代码。它的作用是创建一个包含4个结构的数组,并仅在每个结构中初始化成员l。好的编译器会在此警告(对于gcc使用-Wextra),因为该结构已部分初始化。

由于q未被显式初始化,因此它将被设置为零。这是部分初始化结构的特殊规则。

正确编写的等效代码如下:

typedef struct 
{
  int l;
  int q;
} id_gpios_t;

id_gpios_t id_gpios[] = 
{ 
  {1,0},
  {2,0},
  {3,0},
  {4,0},
};

(使用l作为标识符是众所周知的坏习惯,因为在许多编辑器字体上看起来像1。)

答案 1 :(得分:0)

此代码

struct {
    int l;
    int q;
} id_gpios[] = { {1},{2},{3},{4} };

定义一个由4个元素组成的数组,每个元素都用l初始化,并使用内部花括号中的值,并且q等于0

答案 2 :(得分:0)

广泛地指出,这是由于初始化方法不良所致。 C11(以及更旧的标准)在Section 6.7.9: Initialization下指定了正确初始化变量的方式。

对于{initializer}是什么的法律定义,refer the standard表示

  

初始化程序指定存储在对象中的初始值。

在您的代码中

struct {
    int l;
    int q;
} id_gpios[] = { {1},{2},{3},{4} };

{ {1},{2},{3},{4} };是初始化程序。

此处,q未显式初始化,因此它将被初始化为0。这是由于标准所称的“括号内的初始化不一致”。
请参见标准的“初始化”部分EXAMPLE 5

中提供的示例。

报价相同

struct { int a[3], b; } w[] = { { 1 }, 2 };

标准说

  

该声明是一个括号括起来的初始化定义。它定义了一个具有两个元素结构的数组:w [0] .a [0]为1和w [1] .a [0]为2;其他所有元素均为零。

因此,将您的声明/初始化更改为:

struct {
    int l;
    int q;
} id_gpios[] = { {1, 1},{2, 2},{3, 3},{4, 4} };

或适用于您的要求且兼容的任何东西。

此外,由于lq作为变量没有意义(对我和周围的大多数其他开发人员而言),因此请将lq更改为其他变量这些变量具有什么价值意义。按照这种命名约定,如果有人认真对待Code Review,即使您只是认真一点,也可以确保您不会在Code Review中失败。