【发布时间】:2015-05-27 12:46:30
【问题描述】:
这条线会做什么?
char var[] = {0};
这是否等同于以下内容?
char var[1];
memset(var, 0, NULL);
【问题讨论】:
-
不,他们不是。第二个没有编译。
-
@CoolGuy memset 的第三个参数是要写入的字节数,而不是指针。如果
NULL指针常量在 OP 平台上恰好为 0,并且编译器不会阻塞隐式指针到整数的转换,则memset()无效并且变量为未初始化。 -
回滚到原始问题。我们不要把我们自己的话放在OP的嘴里。
-
@TheParamagneticCroissant 空指针常量必须为
0,或计算结果为0的ICE,可选择转换为(void *)。所以这段代码要么格式错误,要么设置为零字节。 -
@TheParamagneticCroissant 重新措辞,因为它显然不清楚。空指针常量有两种情况:(a) ICE 评估为
0,(b) ICE 评估为0,然后将其转换为(void *)。 (6.3.2.3/3)。在情况 (a) 中,它必须具有零值。由于它已经是整数类型,“转换为整数类型”没有任何变化。在情况 (b) 中,memset格式错误,因为指针不能隐式转换为int。