我不确定用下面的方法初始化后char数组中会有什么。
1.第一个月
2. char buf[10] = " ";
3. char buf[10] = "a";
对于情况2,我认为buf[0]
应该是' '
,buf[1]
应该是'\0'
,并且从buf[2]
到buf[9]
将是随机内容;对于情况3,我认为buf[0]
应该是'a'
,buf[1]
应该是"\0",并且从buf[2]
到buf[9]
将是随机内容。
对不对呀?
对于情况1,buf
中会有什么?buf[0] == '\0'
以及从buf[1]
到buf[9]
将是随机内容?
6条答案
按热度按时间lyr7nygr1#
这不是初始化数组的方式,但用于:
1.第一个宣言:
相当于
1.第二个宣言:
相当于
1.第三个宣言:
相当于
如您所见,没有随机内容:如果初始化器较少,则数组的剩余部分用
0
初始化。即使数组是在函数内部声明的,情况也是如此。pcww981p2#
1.它们是等效的
1.它们是等效的
1.它们是等效的
vbopmzt13#
您的代码将导致编译器错误。您的第一个代码片段:
是双重非法的。首先,在C语言中,没有空的
char
这样的东西。你可以用双引号来指定一个空字符串,比如:这将给予你一个指向
NUL
字符串的指针,即一个单字符串,其中只有NUL
字符,但是你不能使用单引号,里面没有任何东西--那是未定义的,如果你需要指定NUL
字符,你必须指定它:反斜杠对于消除字符
'0'
的歧义是必要的。完成了同样的事情,但前者读起来不那么模棱两可,我想。
其次,在定义数组之后,不能初始化数组。
声明并定义数组。数组标识符
buf
现在是内存中的一个地址,您不能通过赋值更改buf
指向的位置。是非法的。因此,您的第二个和第三个代码片段是非法的。
要初始化一个数组,你必须在定义的时候做:
将给予一个10字符数组,第一个字符是空格
'\040'
,其余字符是NUL
,即'\0'
。当使用初始化器声明和定义数组时,超过指定初始值的数组元素(如果有)将自动用0
填充。不会有任何“随机内容”。如果声明并定义数组但不初始化它,如下所示:
所有元素的内容都是随机的。
lawou6xi4#
C11标准草案n1570 6.7.9初始化的相关部分规定:
以及
因此,'\0'被追加,如果有足够的空间,并且剩余的字符被初始化为
static char c;
将在函数中被初始化的值。最后,
[--]
[--]
因此,
char
是算术类型,数组的余数也保证用零初始化。kuuvgm7e5#
有趣的是,在程序中的任何时候都可以用任何方式初始化数组,只要它们是
struct
或union
的成员。示例程序:
af7jpaap6#
我不确定,但我通常会将数组初始化为“”,在这种情况下,我不需要担心字符串的空结尾。