lkk*_*ing 100 c arrays buffer initialization char
我不确定在初始化后以下列方式在char数组中会出现什么.
1. char buf[10] = "";
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]
随机内容?
oua*_*uah 197
这不是初始化数组的方式,而是用于:
第一个宣言:
char buf[10] = "";
Run Code Online (Sandbox Code Playgroud)
相当于
char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)第二个宣言:
char buf[10] = " ";
Run Code Online (Sandbox Code Playgroud)
相当于
char buf[10] = {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)第三个宣言:
char buf[10] = "a";
Run Code Online (Sandbox Code Playgroud)
相当于
char buf[10] = {'a', 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)如您所见,没有随机内容:如果初始化程序较少,则使用初始化数组的剩余部分0
.即使数组在函数内声明也是如此.
ver*_*ose 22
编辑:在提供此答案后,OP(或编辑)默默地将原始问题中的一些单引号更改为双引号.
您的代码将导致编译器错误.你的第一个代码片段:
char buf[10] ; buf = ''
Run Code Online (Sandbox Code Playgroud)
是双重违法的.首先,在C中,没有空的东西char
.您可以使用双引号来指定空字符串,如下所示:
char* buf = "";
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个指向NUL
字符串的指针,即一个只包含NUL
字符的单字符字符串.但你不能在其中没有任何内容使用单引号 - 这是未定义的.如果需要指定NUL
字符,则必须指定它:
char buf = '\0';
Run Code Online (Sandbox Code Playgroud)
反斜杠是消除字符歧义所必需的'0'
.
char buf = 0;
Run Code Online (Sandbox Code Playgroud)
我认为,完成同样的事情,但前者的阅读不那么模糊.
其次,您无法在定义数组后初始化它们.
char buf[10];
Run Code Online (Sandbox Code Playgroud)
声明并定义数组.数组标识符buf
现在是内存中的地址,您无法buf
通过赋值更改点.所以
buf = // anything on RHS
Run Code Online (Sandbox Code Playgroud)
是非法的.因此,您的第二个和第三个代码片段是非法的.
要初始化数组,您必须在定义时执行此操作:
char buf [10] = ' ';
Run Code Online (Sandbox Code Playgroud)
会给你一个10个字符的数组,第一个字符是空格'\040'
,剩下的就是NUL
,即'\0'
.使用初始化程序声明和定义数组时,将自动填充具有指定初始值的数组元素(如果有)0
.不会有任何"随机内容".
如果声明并定义数组但不初始化它,如下所示:
char buf [10];
Run Code Online (Sandbox Code Playgroud)
你将拥有所有元素的随机内容.
小智 19
这些是等价的
char buf[10] = "";
char buf[10] = {0};
char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)这些是等价的
char buf[10] = " ";
char buf[10] = {' '};
char buf[10] = {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)这些是等价的
char buf[10] = "a";
char buf[10] = {'a'};
char buf[10] = {'a', 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)C11标准草案n1570 6.7.9初始化的相关部分说:
14 字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来.字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.
和
21 如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应与具有静态存储持续时间的对象隐式初始化.
因此,如果有足够的空间,则附加'\ 0' ,并且使用static char c;
将在函数内初始化a 的值初始化剩余的字符.
最后,
10 如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态或线程存储持续时间的对象,则:
[ - ]
- 如果它有算术类型,则初始化为(正或无符号)零;
[ - ]
因此,char
作为算术类型,阵列的其余部分也保证用零初始化.