Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的结构初始化_C - Fatal编程技术网

C语言中的结构初始化

C语言中的结构初始化,c,C,我是C语言的初学者。 我有一个结构,它有不同的数据类型,比如int,float,bool。我试图在初始化期间以及嵌入式应用程序的运行时将此结构初始化为0.0。我正在进行逐个成员的初始化。我不能使用memset()函数,因为它将指针递增2个字节。我想知道是否有一种有效的方法来进行初始化 例: 我无法使用memset()函数,因为它将指针增加2个字节 是的,您可以使用-它不会“增加”任何内容: ABC abc; memset(&abc, 0, sizeof(ABC)); //Sets siz

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

例:

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

是的,您可以使用-它不会“增加”任何内容:

ABC abc;
memset(&abc, 0, sizeof(ABC)); //Sets sizeof(ABC) bytes to 0
这种方法唯一的问题是,设置浮点数的所有位并不意味着它们的值将等于0。特别是,如IEEE 754所述:

-0
+0
是不同的值,尽管它们的比较结果相同。

因此,它们的内部表示形式确实需要不同(因此,它们都不能将所有位都设置为0)。在
ieee754
的情况下,这只是偶然发生的,归零值等于
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
};

最后一个例子只适用于,如果这个结构的所有成员都可以用整型值初始化(这在这个特定的情况下是正确的)。

< P> ISO和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
};

您是否尝试过
ABC={0}?你所说的
是什么意思?它将指针增加2个字节?不增加任何值。没有精确的浮点零所需的引用。这是绝对错误的。在初始化上下文中,值将根据需要隐式转换。请参阅并提出问题。@LvZheng您可能应该阅读有关初始化和数值之间转换的更多信息<代码>浮点f=0
浮点f=0.0f
相等。您所说的完全不正确。IEEE754浮点的设计使得“所有位零”实际上是
+0.0
。这样就没有问题了。然而,C标准并没有强制执行它(只是强烈建议)。在实现细节中使用幻数(定义)充其量是粗心的
0.0
将浮点设置为
0.0
(惊喜,惊喜)。
memset(…,0,…)
将清除所有位。这并不一定意味着除整数类型以外的任何类型都将被设置为其空值(0.0或空指针)。对于浮点,IEEE754的0.0(所有位均为零)恰好为真,但这些不是标准所要求的;特别是在嵌入式系统上,它们可能使用不同的格式。对于指针,标准仅要求空指针不具有有效的指针值;它不需要“所有位为零”。至少为了得到正确的答案,你应该说明这一点。@Olaf是的,确实如此。Done.FYI:“这只是偶然发生的,归零的值等于0”。这不是偶然,而是巧妙的设计。在过去,浮点单位很少见,所以必须经常用软件计算浮点。使+0.0等于整数0允许使用相同的测试和快速清除内存(是,
memset
)。我的观点实际上是非IEEE754格式。标准允许这样做。你们甚至并没有提到指针。@Olaf问题是关于一个特殊的案例,它不涉及指针。我们都知道,不可能在一个简单问题的每个答案中都涵盖整个主题。我提到,非IEEE格式可能不会将零FP变量解释为0。还有,我写的只是草书中偶然发生的事,因为没有偶然,这就是重点。此外,我建议,在这种情况下,最好的解决方案是POD式初始化,它也包括指针,因为它们可以用
0
初始化,然后自动转换为适当的指针类型。我同意(但我们都知道,大多数非平凡的C程序最终都会使用指针)。使用<代码> 0代码>代码初始化指针是旧的C++,在C++中C.从未推荐过,你使用<代码> null pTr> <代码>,在C<代码> null <代码>中,它很可能是<代码>(空洞*)0 < /C>。
#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
};