声明并初始化数组

声明一维数组的一般语法是

type arrName[size];

其中 type 可以是任何内置类型或用户定义的类型,例如结构体,arrName 是用户定义的标识符,size 是整数常量。

声明一个数组(在这种情况下是一个包含 10 个 int 变量的数组)就像这样:

int array[10];

它现在拥有不确定的数值。为了确保在声明时它保持零值,你可以这样做:

int array[10] = {0};

数组也可以初始化,这个例子声明了一个 10 个 int 类型数据的数组,其中前 3 个 int 将包含值 123,所有其他值将为零:

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。