c语言静态存储数组的赋值问题。

c语言规定,只有静态存储数组才能初始化,静态存储数组要用static定义,为什么谭浩强的书在定义字符数组时从来不用static,而是直接赋值?

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修饰。如果你不想在定义的时候初始化,那就只有等到你需要的时候通过赋值操作来进行,数组当然得通过循环
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-03-07
char
s[5]={'1','2'}
相当于对数组初始化,这样的话,数组强两个字符是'1'
'2',其他字符初始化为'\0',这其实是有对s[2]进行赋值的。
而a数组是没有初始化,自然就没对a[1]赋值。
两个题目结果自然就不同了。
相似回答