字符变量 [] = 0;和 char var[1];在C中是等价的吗?
Posted
技术标签:
【中文标题】字符变量 [] = 0;和 char var[1];在C中是等价的吗?【英文标题】:char var[] = 0; and char var[1]; are equivalent in C?字符变量 [] = 0;和 char var[1];在C中是等价的吗? 【发布时间】: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
。
【参考方案1】:
char var[]
将 var
定义为一个 char 数组,其大小由初始化列表大小决定。
所以char var[] = 0
等价于char var[1] = 0
。
在您以后的代码 sn-p 中,var
可能首先未初始化(如果是局部变量,我相信它后面跟着memset
),然后设置为全零。(假设您的意思是memset(var, 0, 1)
) 虽然两个 sn-ps 的可观察效果是相同的,但编译器可能会生成不同的指令,或者编译器可能会选择调用 memset
,这可能会在以后的 sn-p 中增加函数调用开销。
【讨论】:
在第二个示例中,var
未初始化为零。它可能被设置全为零,如果 OP为此编写了正确的代码。
@TheParamagneticCroissant 你是对的,更正了。
你为什么要为自己的目的更改 OP 的代码?在 SO 上严格禁止。您应该在回答中清楚地解释这一点。
如果我给它赋值会发生什么。即超过1个字节?例如:strcpy(var, "some value");
@impulse strcpy(var, "some value")
导致未定义的行为,因为您超出了数组大小(在这种情况下为1
)以上是关于字符变量 [] = 0;和 char var[1];在C中是等价的吗?的主要内容,如果未能解决你的问题,请参考以下文章