C char数组初始化

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,将会是什么bufbuf[0] == '\0'从哪里buf[1]buf[9]随机内容?

oua*_*uah 197

这不是初始化数组的方式,而是用于:

  1. 第一个宣言:

    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)
  2. 第二个宣言:

    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)
  3. 第三个宣言:

    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.即使数组在函数内声明也是如此.

  • 为了提出问题的人,值得指出的是,C标准要求任何部分完成的数组初始化用剩余元素(由编译器)填充零.这适用于所有数据类型,而不仅仅是`char`. (41认同)
  • @lkkeepmoving`0`和`'\ 0`具有相同的值. (12认同)
  • @Pacerier`char buff [3] ="abcdefghijkl";`无效.`char p3 [5] ="String";`也无效.`char p [6] ="String";`有效且与`char p [6] = {'S','t','r','i','n','g'相同};`. (3认同)
  • @ouah为什么buf []结束时没有'\ 0'? (2认同)
  • @delive 你是什么意思,它与这个答案有什么相关性? (2认同)
  • “这不是初始化数组的方式”是什么意思 (2认同)

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

  1. 这些是等价的

    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)
  2. 这些是等价的

    char buf[10] = " ";
    char buf[10] = {' '};
    char buf[10] = {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
    Run Code Online (Sandbox Code Playgroud)
  3. 这些是等价的

    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)


Ant*_*ala 6

C11标准草案n1570 6.7.9初始化的相关部分说:

14 字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来.字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.

21 如果括号括起的列表的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应与具有静态存储持续时间的对象隐式初始化.

因此,如果有足够的空间,则附加'\ 0' ,并且使用static char c;将在函数内初始化a 的值初始化剩余的字符.

最后,

10 如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态或线程存储持续时间的对象,则:

[ - ]

  • 如果它有算术类型,则初始化为(正或无符号)零;

[ - ]

因此,char作为算术类型,阵列的其余部分也保证用零初始化.