TEL:400-8793-956
当前位置:程序、服务器

全局和局部变量声明之间的区别

提问者: 近期获赞: 浏览人数: 发布时间:2020-12-20 15:28:13

 问:在我的项目工作期间,我正在编写一个代码,该代码在初始化两个float数据类型的变量时遇到分段错误,这两个变量的维数在1000和1800之间均为1800,但是当我声明全局变量时,程序可以正常工作。您能告诉我为什么会这样吗,在本地或全局声明变量时如何为变量分配内存是它们的大小限制。我在下面附上两个小程序,其中在全局和本地声明了变量,请看一看。

 
第一程序
#include  “ stdio.h”
#include  “ string.h”
float arr [ 1000 ] [ 1800 ];
float vrr [ 1000 ] [ 1800 ];
int  main ()
{
      memset ( arr ,0 ,sizeof ( arr ));
      memset ( vrr ,0 ,sizeof ( vrr ));
      返回 0 ;
}
第二程序
#include  “ stdio.h”
#include  “ string.h”
int  main ()
{
      float arr [ 1000 ] [ 1800 ];
      float vrr [ 1000 ] [ 1800 ];
      memset ( arr ,0 ,sizeof ( arr ));
      memset ( vrr ,0 ,sizeof ( vrr ));
      返回 0 ;
}
请用尖括号将双引号替换,否则检查所附 程序。
 
 
答:在C语言中,局部变量是在堆栈中分配的内存,而全局数据则不保存在堆栈中。将本地声明的变量保留在堆栈中的主要原因是防止恶意脚本不必要地占用内存空间。
 
由于全局数据未存储在堆栈中,因此可以声明“ arr [1000] [1800]”,如果有足够的可用内存,则会为它分配内存空间。但是,如果您尝试在函数中执行相同的操作,则堆栈大小限制(取决于平台,通常约为8 mb)不会使您的阵列获得所需的内存,从而导致“分段错误”。
 
摆脱这种情况的一种方法是增加堆栈限制,您可以通过在shell中执行以下命令来做到这一点:
ulimit -s 500000 #ie(将您的堆栈限制更改为大约500 mb或根据您的要求)
,希望这可以解决您的疑问。
 
 
答:首先让我指定什么是全局变量和局部变量
 
全局变量定义一个固定大小的空间块。当程序启动时(执行操作的一部分),该空间分配一次,并且永远不会释放。
当输入包含声明的复合语句时,将分配局部变量的空间,并在执行该复合语句时释放该空间。
对于局部变量:
在函数内部定义的变量分配在堆栈上。这意味着当函数退出时,相关的内存被清理(堆栈被“弹出”)。
 
对于全局变量:
在全局范围内定义的变量分配在整个过程的生命周期中存在的数据段(或通常是从操作系统请求的内存空间)中。
 
另外
 
使用malloc分配的内存是从堆中分配的,并保持分配状态,直到使用free明确释放为止。
 
请注意,现代OS可以很好地提供程序请求的地址空间,但在物理上访问内存(或内存的一部分,通常称为页面)之前,不将其物理地返回RAM。
上一篇: 如何在网页上添加计时器
下一篇: 网站上面怎么加视频