• C语言数组放到主函数外面和里面的区别


    今天写OJ时,发现了个小问题,记录一下。方便后期查询!
    OJ题:https://www.acoj.com/problems/10004

    • 相关思路:
    #include <stdio.h>
    
    int main(){
    	int b[1005]; 
    	int N,i,t,num=0;
    	scanf("%d",&N);
    	for(i=1;i<=N;i++){
    		scanf("%d",&t);
    		if(b[t]==0){	// 接受数据,并标记为1,表示其出现过,计入结果 
    			b[t]=1,num++;
    		}
    	}
    	printf("%d
    ",num);
    	for(i=1;i<=1000;i++){
    		if(b[i]==1){
    			printf("%d ",i);
    		}	
    	}
    	return 0;
    } 
    

    乍一看,没毛病。但一运行:

    在这里插入图片描述


    然后就疯狂地Debug,结局竟然只需要:

    在这里插入图片描述

    对!将数组移到外面!!!!可是,why???

    • 参考网络:

    • 先介绍一下栈区(stack),堆区(heap),数据区(data seg)和代码区。

      • 栈区:由操作系统自动分配释放,存放函数的参数值,局部变量的值;当不需要时系统会自动清除。
      • 堆区:由new分配的内存块,不由编译器管,由应用程序控制(相当于程序员控制)。如果程序员没有释放掉,程序结束后,操作系统会自动回收。
      • 数据区:也称全局区或者静态区,存放全局的东西类似全局变量。
      • 代码区:存放执行代码的地方,类似if else,while,for这种语句。
    • 在main函数里面的数组是开在栈区(stack),在函数外面的是开在数据区的。栈区的内存比较小,所以当数组非常大的时候,就会报错。假如把数组放在数据区就不会出现这个问题,因为数据区的内存很大

    • 也就是说,在main函数外面开一个数组,他的内存分配在数据区里;如果在main函数内部开数组,内存分配在栈区内。一般来说栈区的内存是比较小的,所以平常开一些小一点的数组是没问题的;但如果题目要求的数组比较大,那就会出现爆出的问题,程序无法访问内存就会出错;相对的,数据区的内存较大,所以开数组开在数据区/main函数外面,就不易出现这样的问题

    • 这也是为什么很多博客和OJ题解将数组开到主函数外面!!!

    欢迎查阅
  • 相关阅读:
    lintcode-60-搜索插入位置
    lintcode-57-三数之和
    lintcode-55-比较字符串
    lintcode-52-下一个排列
    lintcode-51-上一个排列
    lintcode-49-字符大小写排序
    lintcode-47-主元素 II
    lintcode-45-最大子数组差
    lintcode-44-最小子数组
    Charles抓包
  • 原文地址:https://www.cnblogs.com/gh110/p/14502412.html
Copyright © 2020-2023  润新知