字符变量 [] = 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中是等价的吗?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中字符变量数值取值范围。

什么是字符串变量

使用变量作为函数名和字符串[重复]

scala基本数据类型

C++比较char数组和字符串

C++比较char数组和字符串