簡體   English   中英

C - 是否在使用未定義的 memset 設置后讀取 _Bool,實現已定義?

[英]C - Is reading a _Bool after setting it with memset undefined, implementation defined?

在 ISO 標准 C 中,我的理解是沒有任何東西可以真正確定 _Bool 的表示形式,但它確實說:

  • “_Bool 足夠大以容納值 0 和 1”
  • “當任何標量值轉換為 _Bool 時,如果該值比較等於 0,則結果為 0;否則,結果為 1”
  • “_Bool 中的位數至少為 CHAR_BIT,_Bool 的寬度可以僅為 1 位”

我當時在想(以及其他相關答案), 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是一個無符號的 integer 類型。 它至少可以表示值 0 和 1。請注意,沒有單獨true值和false值。 stdbool.h中的宏true擴展為常量 1,宏false擴展為常量 0 7.18 所以x == truex == 1相同。

無符號 integer 類型中有兩種位:值位和填充位6.2.6.2p1 您對memset的調用將所有位(值和填充)設置為零。

對於任何 integer 類型,所有位均為零的 object 表示應是該類型6.2.6.2p5中值零的表示。

因此,所示的程序片段沒有可見的未定義、未指定或實現定義的行為。 合理完成的程序應打印zero is false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM