在C语言中,字符数组成员的默认值是什么?

12
假设我创建了一个 `char` 数组,并且我假设这个字符数组是空的。如果我检查该数组中第一个元素的值(`arr[0]`),那么这个表达式的结果会是什么?

2
“我假设字符数组为空” - 这句话的意思是什么? - Jim Balter
另外,“初始化字符数组”是什么意思?如果您已经对其进行了初始化,则它将具有初始化程序的值,但我怀疑您并不真正意味着“初始化”。通过发布您的实际代码,您可以解决一些问题(也许可以避免下面可怕的答案)。 - Jim Balter
2
因为@user1723575可以通过尝试或快速的谷歌搜索(或者堆栈溢出搜索)来回答这个问题,所以我会给它点个踩。我不明白为什么有五个答案针对这个琐碎的问题。 - jforberg
7
今天(2014年),我在Google上搜索了“char array initial value”这个词。这个stackoverflow的问题是我搜出来的第一个结果。起初,因为这个问题被投票下降并被关闭,我几乎认为来这里是浪费时间。但幸运的是,John Bode的回答给了我我想要的答案。 - Tim Gradwell
3
我同意@TimGradwell的观点,下面的答案有帮助并且我理解了提问者的问题。提问者可以通过社区的帮助来使问题更清晰明了。当你刚开始学习编程时,你可能没有足够的词汇来表达你所需要的(因此社区可以编辑问题)。 - Rachael
显示剩余2条评论
4个回答

29

这取决于数组声明的位置和方式。

如果数组在文件作用域(任何函数之外)中声明,或者声明为static,且没有明确的初始化程序,则数组的内容将被初始化为0。

如果数组在块作用域(函数或块内部)中声明,并且未声明static,也没有明确的初始化程序,则数组的内容是不确定的(基本上是垃圾值,其中一些可能是陷阱表示)。

如果数组已经明确初始化,则它包含初始化程序中的内容。

编辑

针对下面的评论,注意不应该依赖隐式初始化块作用域变量。如果需要创建零值化的块作用域数组,请使用初始化程序:

char foo[N] = {0};
当初始化器中的元素比数组中的元素少时,与初始化器中元素对应的数组中的元素将被设置为指定的值;所有其余的条目将被隐式初始化,就像它们被声明为static一样。
在上面的例子中,这意味着foo的第一个元素被明确设置为0,而所有其余元素都被隐式设置为0

4
无论如何,依赖它都是不好的形式。必须为零的变量应该明确地初始化为零。 - jforberg
1
@John Bode:你说的都是事实 - 我只是担心OP可能会得出这样的结论:“哦 - 我应该把所有变量都设为静态的,这样我就不必初始化它们了。” 更好的答案可能会简要地涉及“定义”与“声明”的问题,或者解释一下为什么一个变量应该是自动的、静态的还是从堆中分配的。我同意jforberg的观点。在我看来... - paulsm4
我认为你可以直接说char foo[N] = {}; - Jo So
我想澄清一个不确定的值也可以是0。这意味着,如果foo [0]是默认初始化为0而没有显式的初始化程序,则foo确实具有0长度。 - wulfgarpro

3
如果它是一个auto变量,除非你明确初始化它,否则它将被填充垃圾值,因此没有默认值。arr[0]将包含一个看似随机的值,直到被显式更改为包含其他内容。
当然,如果你初始化了数组(也就是说,你使用memset()for循环、函数调用或其他方式显式地填充了数组的初始值),你将得到你所期望的值:你用来初始化它的值。
请注意声明和初始化之间的区别。
void f(void) {
    int x;  // (1)
    x = 10; // (2)
}

(1)处,你声明了一个auto整数变量。它现在有一个未定义的值(垃圾值)。在(2)处,你初始化了这个变量。它现在的值是10

当然,声明和初始化也可以同时完成:

void f(void) {
    int x = 10;
}

对于数组也是一样的:

void f(void) {
    int x[2];  // x contains 2 junk values, so x[0] == junk
    x[0] = 1;  // x contains { 1, junk },   so x[0] == 1
    x[1] = 2;  // x contains { 1, 2 },      so x[0] == 1
}

或者,声明并初始化它:
void f(void) {
    int x[2] = { 1, 2 };
}

0

在你首次初始化一个变量时,除非你明确地指定它,否则永远不要期望它有任何特定的值。否则它会被填充随机数据,除非你自己设置。


我将其值与 '\0' 进行了比较,例如:arr[0]=='\0',结果为真。我认为这是因为空间中确实没有内容,但如果有其他内容的话,我的假设就是错误的,对吗? - user1723575
是的,你永远不知道可能已经存在或不存在什么。 - zachjs

-2

当初始化数组时,您正在分配静态内存。然后,您将获得已分配内存的值,因此它是随机值。

如果您想将整个数组设置为0,则可以按照Hunter McMillen的建议进行操作。

char arr[size] = { 0 }

或者使用memset()函数

memset(arr,0,sizeof_your_arr);

你也可以这样写:char arr[size] = { 0 } - Hunter McMillen

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