C语言,全局变量,静态变量问题

全局变量必须是static类型这句话对吧
如果要限定外部变量只允许在该文件使用而不允许在其它文件使用,可在外部变量定义前面加上static声明。
例:static int a=3, b=5;
main( ) { … }
f1 ( ) { … }
f2 ( ) { … }
如果不加static,将外部变量作用域扩展到其它文件,变量用extern作声明即可,如下例子,那是不是说明x,y的存储类型不是static?是自动型auto?这与全局变量必须是static类型矛盾啊
P125例:file1.c 定义的变量在file2.c可以引用
P125_1.cpp P125_2.cpp
int x, y ; extern int x, y ;
char ch; extern char ch;
main( ) f1( )
{ x=12; {
y=24; printf(“%d, ”,x);
f1( ); printf(“%d\n”,y);
printf (“%c”, ch); ch=‘a’;
} }
还有这句话 自动变量,auto(默认,可省略),自动局部变量在本函数内有效,(自动全局变量在本文件有效,其他文件可引用,引用时加extern声明。为静态存储,有固定内存单元)是说知道全局变量的类型为static?

全局变量 一般指在程序入口地址之前定义的数据(C语言源程序里面是在main函数之前定义,Windows程序是在WinMain函数之前定义的数据),全局变量一般不需要加任何关键字声明。直接在main函数之前定义int a;就可以了。要注意全局变量是在编译时分配存储单元的,所以如果你不对它初始化的话编译器会自动把它初始化为0,全局变量的作用域为整个程序,所以一个程序里面所有的子程序(函数)都能使用它。

局部变量 因为全局变量可以被一个程序的所有函数使用,所以为了防止程序里面一个函数专用的数据被其他函数有意或无意的修改,所以引入了局部变量,局部变量可以用auto关键字申明,但是一般都省略auto关键字,局部变量是在函数里面定义的,比如在主函数里面定义int a=0;在fun函数里面定义int b=0;局部变量是在程序执行的时候临时分配存储单元的,它存储在堆栈段中,每个函数开始执行前都会先算出这个函数里面有多少个局部变量,占多少个存储空间,然后增加堆栈段空间以容纳这些数据,因为是临时分配的存储空间,所以所有的局部变量都是未初始化的,它里面的数据是其他函数用过的垃圾数据,你必须要给局部变量赋初值。在函数结束后会释放堆栈段空间,也就是局部变量只在它所在的函数的生命周期内有效。当一个函数执行结束后这个函数内的全部局部变量就全部不能用了。

静态变量 因为局部变量的生命周期只在改局部变量所在的函数生命周期内有效,但是在很多程序内一个函数内的局部变量往往要保留,以便改函数下次调用时使用,所以就有了静态变量这个概念。静态变量与全局变量差不多,也是在编译时分配内存空间,并且自动初始化为0,静态变量的生命周期也是整个程序。但是与全局变量不同的是静态变量只有它所在的函数能够使用它,程序里面其他的函数是不能够访问它的。静态变量必须用static关键字申明。比如 static int a;追问

懂不懂,不要复制,都没回答到我的问题

追答

汗。。好心帮你写这么久。。你能把这些看懂的话变量这些你也懂了,如果看不懂的话就不要刨根问底的问这些东西,我刚学C语言也跟你一样想把什么都搞懂,其实这完全不必要,如果你只想会用的话就自己多写点程序,写多了你自然会用。你想要弄懂原理的话就去学汇编,32位微机原理,总之这是个好心的建议喽。

追问

好的,那你给我解释下楼下的回答的对吗

追答

所有变量默认都是auto的

追问

那全局变量必须是static 类型吗?

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-03-20
(1)可以肯定,全局变量 不是必须要加static修饰,那么加了static修饰是什么意思?
答:在全局变量前加static表示变量只能在该文件中被引用,而不能在其他文件中用extern关键字引用,例如:
a.c文件:
#define<stdio.h>
int BASE = 100;
int main(){}
b.c文件:
#define <stdio.h>
extern BASE; //在b.c文件中利用extern关键字引用了a.c中的BASE,但如果a.c中用static修饰BASE,那这里的引用就会报错
int main(){printf("%d\n",BASE);}

(2)auto修饰符的定义里有这么一句“进入包含变量声明的代码时,变量开始存在。当程序离开这个代码块时,自动变量消失了。它所占用的内存可用来做别的事情。”,从“当程序离开代码块时变量消失”、“内存可用来做别的事情”可以推出auto修饰的变量是存储在堆栈中的。而全局变量存储在静态存储区中,所以用auto决不能修饰全局变量(已经测试过,Linux下报错:文件作用域中 ‘apple’ 的声明指定了 ‘auto’)

x,y不是static?是auto?答案:不是auto类型
所以我觉得结论是不是这样:
修饰全局变量的存储类型只有static和extern或者不加修饰,auto不能用来修饰全局变量。本回答被提问者和网友采纳
第2个回答  2013-04-13
全局变量必须是static 类型
这句话是错的 static 类型全局变量是全局变量的其中一种形式追问

你确信?那上面的x,y类型是自动型auto?可是我又看到这句话auto变量只用于定义局部变量,存储在内存中动态存储区。

追答

#include

int a; //这个变量就是全局变量
int mian(void)
{

}

追问

它的存储类型是什么

追答

auto

追问

我又查了资料,全局变量不可能是auto类型的啊。你从哪个知道的全局变量可以是auto类型的

追答

关键是会用 纠结这些干嘛 说实话什么时间域 作用域 我当年用C的时候都没怎么看 主要是写代码 不是搞语法 除非你是教师

相似回答