考慮下面的代碼 -
typedef struct meh {
int a;
bool valid;
} var;
int main(){
var *ptr = calloc(1, sizeof(var));
return 1;
}
我知道 calloc 默認將記憶體初始化為 0(或等效值)。是否仍然是有效的情況。是否可以這樣說:
ptr->valid;
將始終回傳 False(除非顯式初始化為 true)以取消參考使用 calloc 分配記憶體的指標(如 ptr)。
uj5u.com熱心網友回復:
calloc()給你一個零初始化的緩沖區。因此, inptr->valid將為零,因此false.
#define bool _Bool
#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L
#define true ((_Bool) 1u)
#define false ((_Bool) 0u)
#else
#define true 1
#define false 0
#endif
上面的代碼片段來自stdbool.h頭檔案,其中明確定義false了0.
而且,你會停止使用嗎return 1;,它說發生了錯誤,而不是使用return 0;or return EXIT_SUCCESS;。
嘗試運行以下代碼:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct meh {
int a;
bool valid;
} var;
int main(void)
{
var *ptr = calloc(1, sizeof(var));
if(ptr->valid)
puts("true\n");
else
puts("false\n");
printf("%d\n", false); // prints 0
free(ptr);
return EXIT_SUCCESS;
}
uj5u.com熱心網友回復:
(“C 2018”是指2018 C 標準。)
C 2018 6.2.5 6 說“……_Bool與標準有符號整數型別對應的型別和無符號整數型別是標準無符號整數型別。”
C 2018 6.2.6.2 5 說“......對于任何整數型別,所有位為零的物件表示應是該型別中值零的表示。”
因此,任何_Bool分配的空間calloc在更改之前都將具有零值,并且零在 C 中的不同位置用作 false。
(為了完整起見,C 2018 7.22.3.2 2 表示分配的記憶體calloc被初始化為所有位為零,而 C 2018 6.2.5 17 表示“型別char、有符號和無符號整數型別以及列舉型別統稱為整數型別...... ”)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/456700.html
