NYOJ 224 灯光师小明
刚开始一直不能编译,后来才知道,当数组所占空间比较大时,就不能放进函数里,因为在函数里定义的变量,是在栈上创建的,数组太大,会造成栈溢出,使程序出错。而全局变量是在数据段创建的,可非常大
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int light[1000010];//不能放到函数里是由于在函数中定义的变量,在栈上创建,全局定义的变量,在数据段上创建。由于你的数组太大,会造成栈溢出,使得程序错误 5 int main() 6 { 7 int n,t,m,sum=0; 8 char str[10]; 9 memset(light,0,sizeof(light)); 10 scanf("%d%d",&n,&t); 11 while(t--) 12 { 13 scanf("%s",str); 14 if(strcmp(str,"CHANGE")==0) 15 { 16 scanf("%d",&m); 17 if(light[m]==0) {light[m]=1;sum++;} 18 else {light[m]=0;sum--;} 19 } 20 else printf("%d\n",sum); 21 } 22 system("pause"); 23 return 0; 24 }
知识补充:
在函数中定义的变量,在栈上创建,全局定义的变量,在数据段上创建。
由于你的数组太大,会造成栈溢出,使得程序错误。堆栈据说是2M大小,而数据段要大很多,具体多大好像与系统环境相关。
数组定义在函数中时,占用的内存来自栈空间,栈空间是在进程创建时初始化的,有固定的大小,一般为几十KB,所以太大的数组会耗光栈空间。
而全局变量占用的数据段空间,可以非常大,32位的系统中可以大到4GB。
全局变量和局部变量不在同一片存储区,栈的连续空闲内存不足以容纳c[100002](太大,但是可以容纳10002,所以你后面改成10002就行了),所以放在main中运行时出错,移为全局数组,存储在全局存储区,有足够的内存保存,所以运行OK..
使用全局变量的优点是:可以减少变量的个数,减少由于实际参数和形式参数的数据传递带来的时间消耗。
但是,使用全局变量也有许多缺点:
(1)全局变量保存在静态存贮区,程序开始运行时为其分配内存,程序结束释放该内存。与局部变量的动态分配、动态释放相比,生存期比较长,因此过多的全局变量会占用较多的内存单元。
(2)全局变量破坏了函数的封装性能。前面的章节曾经讲过,函数象一个黑匣子,一般是通过函数参数和返回值进行输入输出,函数内部实现相对独立。但函数中如果使用了全局变量,那么函数体内的语句就可以绕过函数参数和返回值进行存取,这种情况破坏了函数的独立性,使函数对全局变量产生依赖。同时,也降低了该函数的可移植性。
(3)全局变量使函数的代码可读性降低。由于多个函数都可能使用全局变量,函数执行时全局变量的值可能随时发生变化,对于程序的查错和调试都非常不利。
因此,如果不是万不得已,最好不要使用全局变量。
全局变量和局部变量:链接:http://hi.baidu.com/huiweics/item/4f0845599701fc0ce6c4a571