声明并初始化数组
声明一维数组的一般语法是
type arrName[size];
其中 type
可以是任何内置类型或用户定义的类型,例如结构体,arrName
是用户定义的标识符,size
是整数常量。
声明一个数组(在这种情况下是一个包含 10 个 int 变量的数组)就像这样:
int array[10];
它现在拥有不确定的数值。为了确保在声明时它保持零值,你可以这样做:
int array[10] = {0};
数组也可以初始化,这个例子声明了一个 10 个 int
类型数据的数组,其中前 3 个 int
将包含值 1
,2
,3
,所有其他值将为零:
int array[10] = {1, 2, 3};
在上面的初始化方法中,列表中的第一个值将分配给数组的第一个成员,第二个值将分配给数组的第二个成员,依此类推。如果列表大小小于数组大小,则如上例所示,数组的其余成员将初始化为零。通过指定列表初始化(ISO C99),可以显式初始化数组成员。例如,
int array[5] = {[2] = 5, [1] = 2, [4] = 9}; /* array is {0, 2, 5, 0, 9} */
在大多数情况下,编译器可以为你推断出数组的长度,这可以通过将方括号留空来实现:
int array[] = {1, 2, 3}; /* an array of 3 int's */
int array[] = {[3] = 8, [0] = 9}; /* size is 4 */
不允许声明一个零长度的数组。
Version < C11
在 C99 中加入可变长度阵列(简称 VLA),并在 C11 中任选。它们等于普通数组,有一个重要区别:编译时不必知道长度。VLA 具有自动存储持续时间。只有指向 VLA 的指针才能具有静态存储持续时间。
size_t m = calc_length(); /* calculate array length at runtime */
int vla[m]; /* create array with calculated length */
重要:
VLA 是有潜在危险的。如果上例中的数组 vla
要求堆栈上的空间多于可用空间,则堆栈将溢出。因此,在风格指南以及书籍和练习中经常不鼓励使用 VLA。