c语言的全局变量放哪儿,定义全局变量的位置C语言

1,定义全局变量的位置C语言全局变量可以定义在任何位置, 只要不被包含在任何函数内即可.理论上作用域是整个项目.但如果不做声明情况下, 作用域为定义位置到所在文件尾.每增加一个声明, 作用域会扩展从声明位置到该文件尾范围.1. 全局变量定义的时候是可以对其进行初始化的 。2. 如果有一个地方对全局变量的值进行了修改,那么其它有用到该变量的地方值都会变成修改后的值 。3. 再一个就是全局变量被覆盖的问题了 , 比如你在某个方法里面又重新定义了一个int shu,那么你原先的全局变量shu就被覆盖掉了,如果需要继续使用全局变量shu的话,必须是这种格式::shu 。
2,全局变量是分配在栈上还是静态存储区全局变量存储在静态存储区局部变量存储在栈里new,malloc分配的内存存储在堆里你可以这么理解:全局变量是程序是整个程序都需要用到的 , 单独分出一块存储区保存,该存储区存储的数据不清空局部变量是函数退出时自动清空的,所以放在栈里做临时存储new,malloc分配的内存需要自己手动申请自己手动释放;;在当前线程的堆栈上对不起,上面答错了全局变量是放在可执行程序的映象当中的全局变量全部存储在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放 。在程序执行过程中它们占据固定的存储单元,而不是动态的进行分配和释放 。静态变量在程序执行完了清空,就从静态存储区中释放 。
3 , 求问初始化的全局变量一定放在data段中吗学过C语言的都知道,已经初始化的全局变量是放在.data段中的,没有初始化的全局变量是放在.bss段中的 。一直以来我也是这么认为的 , 但在开发MyOS的过程中,一些明明已经初始化的数据在执行时得到的却是随机值,使我对这个说法产生了怀疑 。例如,在MyOS的VBE驱动中,背景色明明设成了黑色,可系统启动后屏幕却是红色的 。昨天,在真机上调试最新的MyOS代码时,任务调度老是调度不到别的线程去,只有一个Idle线程在跑 。输出了很多的调试信息,可就是找不到哪错了 。最后发现,系统的确是进行调度了 , 可被选中的新的线程还是Idle线程 。而进程和线程管理的代码经过检查是没错的 。而且还有一个奇怪的现象就是在调试信息中为了看到系统的确的不断输出,我在每个输出语句后加了一个从0开始不断增加的数,每次输出就递增,这样就能看到变化了 。在VMWare上,工作的很好,是从0开始递增的,可在真机上是从一个很大的数开始递增的 。就在我即将崩溃之际,突然想到是不是flag这个控制线程创建的全局变量也没有按照我想的那样初始为0,导致根本没有别的线程被创建,所以就只有Idle一个线程在运行 。当我把flag设成局部变量后 , 系统就正常了 。我猜想是不是编译器发现变量是被初始化成了0,所以就把变量放到.bss段中了 。因为.bss段一般情况下会清0的 。所以,编译器认为没有必要把这个变量放在.data段中 。而MyOS在启动的时候,并没有把.bss段占用的内存清0 。因为我一直认为.bss段中放的是未初始化的数据,清不清0关系不大,只要我保证在使用时初始化就是了 。没想到编译器把已经初始化为0的变量也放到了.bss段中了 。当然,这样可以减少可执行文件的体积 。而且正如上面所说,一般的系统都会把.bss段清0,所以不会有问题 。而MyOS是个操作系统,没有人帮我们把它清0,才出现了上面说到的很多问题 。接下来的几天,应该修复MyOS的这个Bug,添加把.bss段清0的代码 。当然,只需4行C代码即可,即时是汇编也不会超过10行 。大家可以看出来,这个说法其实是我的猜测,所以还是需要实际验证 。但我想应该是这样的 。【c语言的全局变量放哪儿,定义全局变量的位置C语言】

    推荐阅读