C-在使用未定义的memset设置后读取_Bool,是否定义了实现



在ISO标准C中,我的理解是没有什么能真正确定_Bool的表示,但它确实说明:

  • &quot_Bool足够大以保持值0和1〃
  • "当任何标量值转换为_Bool时,如果该值比较等于0,则结果为0;否则结果为1〃
  • "池中的比特数至少为CHAR_ BIT

我当时在想(以及从其他相关答案来看(,false的表示实际上不需要是0(尽管在几乎所有的实现中都是(。那么,如果您将_Bool成员设置为0,然后以某种方式使用它,会发生什么呢?这是未定义的行为(默认情况下,因为标准中没有定义(还是实现定义的行为?这似乎很重要(在我的理解中(,因为在前一种情况下,它不是一个定义良好的C程序,在后一种情况中,它是。例如,这是一个未定义的行为吗?false可以有0以外的表示形式吗?

#include <stdbool.h>
//...
bool x = true;
memset(&x, 0, sizeof(bool));
if(x == true)
{
printf("Zero is true!");
}
else
{
printf("zero is false!");
}

_Bool是一个无符号整数类型。它至少可以表示值0和1。请注意,没有单独的truefalse值。stdbool.h中的宏true扩展为常数1,宏false扩展为常数0 7.18。所以x == truex == 1是一样的。

无符号整数类型中有两种类型的位:值位和填充位6.2.6.2p1。您对memset的调用将所有位(值和填充(设置为零。

对于任何整数类型,所有位都为零的对象表示应为该类型6.2.6.2p5中值零的表示。

因此,所示的程序片段没有可见的未定义、未指定或实现定义的行为。合理完成的程序应打印zero is false

相关内容

  • 没有找到相关文章

最新更新