在 C 语言中,一个未初始化的字符数组默认值是什么?

11

给定以下声明:

char inputBuffer[12];

数组中每个字符的默认值是什么? 我想知道这个问题因为如果我想要清除数组中的任何一个位置,我需要知道给它赋什么值。


1
这取决于数组声明的位置。例如,在函数中它将是垃圾值,在BSS中它将被设置为0。请查看维基页面http://en.wikipedia.org/wiki/Data_segment。 - AndersK
可能是重复的问题,参见C语言中静态变量的初始化方法 - harmic
1
它被称为未初始化,因为它没有被初始化。如果有定义的默认值,它将被称为默认初始化。要清除数组中的位置,您不需要做任何事情。 - n. m.
清除数组中的一个位置,你实际上什么都不需要做。这可能不是一种有意义或有用的观点……如果你想要有“清除”值的概念,你必须选择一个哨兵值,该值将被视为已清除/未使用等,或者保留一些单独的、额外的记录来标记哪些索引是“清除”的。 - Tony Delroy
“我对此感兴趣,因为如果我想要在数组中清除一个位置,我需要知道要赋予它什么值。”-- 这没有意义。给它你想要的值即可。 - Jim Balter
@TonyD 如果一个未初始化的位置被认为是已清除的,那么在任何其他状态下它都是已清除的,不需要做任何操作。 - n. m.
2个回答

12

除非数组被定义在文件作用域或具有static存储类别说明符,否则数组元素的值是不确定的,如果满足上述条件,则数组元素被初始化为0

 #include <stdio.h>

 char inputBuffer1[12];          // elements initialized to 0
 static char inputBuffer2[12];   // elements initialized to 0

 void foo(void)
 {
     char inputBuffer3[12];         // elements have indeterminate value!
     static char inputBuffer4[12];  // elements initialized to 0
 }

在我的情况下,变量是全局的,因此它们被初始化为0。 如果我要“清除”数组元素的值,那么意味着将其传递为0,对吗? - Andrei Oniga
@AndreiOniga 如果你想要一个数组被显式地初始化为0(以避免不确定的值):在声明时,使用char inputBuffer3[12] = {0};,在它被声明后使用memset - ouah

10
如果char inputBuffer[12];是全局或静态的,则会用\0进行初始化。
char inputBuffer1[12];  /* Zeroed */
static char inputBuffer1[12];  /* Zeroed */

int fn()
{
  static char inputBuffer3[12];  /* Zeroed */
}

如果是函数内部的局部变量,它包含垃圾值。
int fn2()
{
  char inputBuffer4[12];  /* inderminate value */
}

引用自《ISO/IEC 9899:TC2委员会草案-2005年5月6日WG14/N1124》
6.7.8节 初始化(强调是我的)
10 如果一个具有自动存储期的对象没有显式初始化,则其值是不确定的。如果一个具有静态存储期的对象没有显式初始化,则:
— 如果它具有指针类型,则初始化为null指针;
— 如果它具有算术类型,则初始化为(正数或无符号)零;
— 如果它是一个聚合体,则每个成员都按照这些规则(递归地)初始化;
— 如果它是一个联合体,则第一个命名成员按照这些规则(递归地)初始化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接