假设我创建了一个 `char` 数组,并且我假设这个字符数组是空的。如果我检查该数组中第一个元素的值(`arr[0]`),那么这个表达式的结果会是什么?
这取决于数组声明的位置和方式。
如果数组在文件作用域(任何函数之外)中声明,或者声明为static
,且没有明确的初始化程序,则数组的内容将被初始化为0。
如果数组在块作用域(函数或块内部)中声明,并且未声明static
,也没有明确的初始化程序,则数组的内容是不确定的(基本上是垃圾值,其中一些可能是陷阱表示)。
如果数组已经明确初始化,则它包含初始化程序中的内容。
编辑
针对下面的评论,注意不应该依赖隐式初始化块作用域变量。如果需要创建零值化的块作用域数组,请使用初始化程序:
char foo[N] = {0};
当初始化器中的元素比数组中的元素少时,与初始化器中元素对应的数组中的元素将被设置为指定的值;所有其余的条目将被隐式初始化,就像它们被声明为static
一样。foo
的第一个元素被明确设置为0
,而所有其余元素都被隐式设置为0
。char foo[N] = {};
。 - Jo Soauto
变量,除非你明确初始化它,否则它将被填充垃圾值,因此没有默认值。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,则可以按照Hunter McMillen的建议进行操作。
char arr[size] = { 0 }
或者使用memset()
函数
memset(arr,0,sizeof_your_arr);
char arr[size] = { 0 }
。 - Hunter McMillen