C中的结构初始化

时间:2015-08-01 11:47:09

标签: c

我是C的初学者。 我有一个结构有不同的数据类型作为成员,如int,float,bool。我试图在初始化期间以及在嵌入式应用程序的运行时将此结构初始化为值0.0。我正在通过成员初始化做成员。我不能使用memset()函数,因为它将指针递增2个字节。我想知道是否有一种有效的方法来进行初始化。

例如:

typedef struct _ABC_
{
       float a;
       float b;
       float c;
       int x;
       bool_t y;
}ABC;

2 个答案:

答案 0 :(得分:6)

  

我无法使用memset()函数,因为它将指针递增2个字节。

是的,你可以使用memset() - 它没有"#34;增量"任何东西:

ABC abc;
memset(&abc, 0, sizeof(ABC)); //Sets sizeof(ABC) bytes to 0

这种方法的唯一问题是设置浮点数的所有位并不意味着它们的值将等于0.特别是,当IEEE 754表示:

  

-0+0是不同的值,但它们都相等。

的确,它们的内部表示需要不同(因此,它们都不能将所有位都设置为0)。如果IEEE 754 只是意外发生,则归零值等于0。其他FP表示可能(也可能会)在该问题上有所不同。

因此,您可能希望将此结构初始化为每个POD类型:

ABC abc =
{
    0.0f, //a
    0.0f, //b
    0.0f, //c
    0,    //x
    false //y
};

甚至更好:

ABC abc =
{
    0 //initializes all members to 0
};

最后一个示例仅适用,如果此结构的所有成员都可以使用整数类型的值进行初始化(在此特定情况下为true)。

答案 1 :(得分:-4)

ISO c和ISO c ++标准规定,将所有位设置为零并不能保证浮点值为零。你必须明确地为它指定0.0。

此外,没有确切的浮点零。有五个不同的数值范围,单精度浮点数无法表示:

  • 负数小于 - (2-2e-23)×2e127(负溢出)
  • 负数大于-2e-149(负下溢)
  • 小于2e-149的正数(正下溢)
  • 大于(2-2e-23)×2e127(正溢出)的正数

建议:

#define INFINITESIMAL 2e-149

ABC abc =
{
    INFINITESIMAL,
    INFINITESIMAL,
    INFINITESIMAL,
    0,
    false,  // You may preserve the comma at the end of the list in ISO C99
};