假设我有一些遗留代码,除非发现错误,否则无法更改,并且它包含以下代码:
bool data[32];
memset(data, 0, sizeof(data));
Run Code Online (Sandbox Code Playgroud)
这是bool将数组中的所有false值设置为值的安全方法吗?
更一般地,是安全的memset一bool对0,以使其价值false?
是否保证可以在所有编译器上运行?或者我是否要求修复?
让我们立即开始示例代码:
#include <stdio.h>
#include <stdbool.h>
typedef union {
bool b;
int i;
} boolIntUnion;
int main(void) {
boolIntUnion val;
val.i = 0;
printf("i = %d; %s\n", val.i, ((val.b) ? "true" : "false"));
val.i = 1;
printf("i = %d; %s\n", val.i, ((val.b) ? "true" : "false"));
val.i = 2;
printf("i = %d; %s\n", val.i, ((val.b) ? "true" : "false"));
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,如果使用您在这里看到的联合是某种未定义的行为。我感兴趣的是第三种情况,我将其设置val.i为2,但随后使用 union via 中的布尔值val.b作为打印字符串的条件。2在 MSVC 19 和 gcc 中,我得到了联合中的预期行为,导致了truefrom的值val.b,但是使用 …