10

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

4

4 回答 4

27

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

如果数组是在文件范围内声明的(在任何函数之外),或者是声明static的,并且没有显式的初始化器,那么数组的内容将被初始化为 0。

如果数组在块范围内(在函数或块内)声明并且未声明static,并且没有显式初始化程序,则数组的内容是不确定的(本质上是垃圾值,其中一些可能是陷阱表示) .

如果数组已被显式初始化,则它包含初始化程序中的任何内容。

编辑

针对下面的评论,请注意您不应该依赖于块范围变量的隐式初始化。如果您需要在创建时将块范围数组清零,请使用初始化程序:

char foo[N] = {0};

当初始化器中的元素少于数组中的元素时,数组中与初始化器中的元素对应的元素将被设置为指定的值;所有剩余的条目将被隐式初始化,就像它们被声明一样static

在上面的示例中,这意味着 的第一个元素foo显式设置为0,而所有其余元素都隐式设置为0

于 2012-10-05T16:40:16.500 回答
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 };
}
于 2012-10-05T16:21:47.850 回答
-1

除非您明确指定,否则不要期望任何变量在首次初始化时具有任何特定值。除非您自己设置,否则它将充满随机的东西。

于 2012-10-05T16:24:28.057 回答
-3

启动阵列时。你正在分配一个静态内存。然后你会得到分配内存的值,所以它是随机值

如果你想将整个数组设置为 0 则(根据Hunter McMillen Remark)

char arr[size] = { 0 }

或使用memset()功能

memset(arr,0,sizeof_your_arr);
于 2012-10-05T16:23:06.067 回答