在网上看到这个:
初始化数组时,未使用静态存储
int a[3]={0,1,2};
这样初始化数组是不对的。C语言规定只有静态存储(static)数组和外部存储(extern)数组才能初始化。应改为:
static int a[3]={0,1,2};
真的是这样吗?谭浩强那本书上说,可以在定义数组时初始化,如:
int a[3] = {0,1,2};
为什么我在网上搜到的会是上面的说法呢?那种是对的?
C语言是不是不能这样给数组赋值:
main()
{
int a[3];
a[3] = {0,1,2};
}
哪位大虾帮我解释一下好吗?
參考答案:ANSI/ISO C之前,对数组的一次性初始化必须要求数组被声明为静态的,楼上说static和extern与变量的使用范围有关,没错,但不是这里要使用的含义,这里静态(全局变量默认为静态的)指的是该变量只初始化一次。全局变量肯定是只初始化一次的,所以这主要是针对函数块里面声明的变量来说的,就是说在函数块里面声明的静态局部变量,只在第一次进入这个函数块的时候才进行初始化。ANSI/ISO C允许对声明的非静态数组也进行一次性初始化。所以在支持ANSI/ISO C标准的编译环境下,函数块内写
static int a[3] = { 2, 4, 5 };
和
int a[3] = { 2, 4, 5 };
都对。
函数块外面写static时才是楼上所说的变量的适用范围,不加static声明出来的变量的范围可以在文件之间,加了static声明的变量则只在该文件内。但此时,你加不加static都不会影响你写int a[3] = { 2, 4, 5 };因为这个时候a是全局变量,默认的是静态的,这样的初始化当然没有问题的。
另外,这种一次性初始化必须在定义一个变量的时候才是允许的。这一点,楼主要谨记,不管是ANSI/ISO C还是C99都是不允许出现
int a[3];
a[3] = { 2, 4 , 5 }
的,不管有没有static修饰。如果你不想在定义的时候初始化,那就只有等到你需要的时候通过赋值操作来进行,数组当然得通过循环。