局部变量

函数内可变量的声明是局部的。局部变量在声明的部分里是被限定的。局部变量可以由任意一个表达式结果初始化。 每次函数的运行只可以初始化一个局部变量。局部变量储存在相应的存储器上。

示例:

int somefunc()
  {
   int ret_code=0;
   ...
   return(ret_code);
  }

变量范围是涉及变量的模块部分。模块中声明的变量(内部),有模块规定其范围。变量声明启动模块范围,以终止程序结束。

开始函数声明的局部变量也有模块范围,和局部变量函数参数。任何模块都可以包括变量声明。如果嵌入模块内外模块有同名标识符,隐藏外部指标,直到内部操作完成。

示例:

void OnStart()
  {
//---
   int i=5;      // 函数的局部变量
     {
      int i=10;  // 函数变量
      Print("In block i = ",i); // 结果是 i=10;
     }
   Print("Outside block i = ",i);  // 结果是 i=5;
  }

这意味着内部模块运行时,只看到自己的局部指标值,看不到外部同名指标值。

示例:

void OnStart()
  {
//---
   int i=5;      // 函数局部变量
   for(int i=0;i<3;i++)
      Print("Inside for i = ",i);
   Print("Outside the block i = ",i);
  }
/* Execution result
Inside for i = 0
Inside for i = 1
Inside for i = 2
Outside block i = 5
*/

即使从启动模块就存在,公开静态局部变量仍有模块范围。

存储栈 #

在每个MQL5程序中,称为存储栈的特殊内存区被分配存储自动创建的局部函数变量。一个存储栈可以分配给全部函数,指标的默认大小等于1Mb。在EA交易和脚本中,存储栈大小都可以使用#property stacksize编译指令(以字节设定存储栈大小)来管理, 默认情况下,为存储栈分配8Mb内存。

静态局部变量存储在与其他静态和全局变量存储的相同的地方 - 特殊的内存区域 ,它是独立于存储栈的存在。动态创建的变量也使用独立于存储栈的内存区域。

随着每个函数的调用,存储栈上的区域分配给内部非静态变量。退出函数后,内存可再次提供使用。

如果从第一个函数调用第二个,然后第二个函数从剩下的栈内存占据变量所需的大小。因此,当使用包含函数时,每个函数将会连续占据栈内存。这可能会导致一个函数调用期间的内存不足,这种情况被称为存储栈溢出。

因此,对于大型本地数据,您应该更好地利用动态内存 - 当进入一个函数时,分配本地所需的内存,在系统(newArrayResize()),和退出函数时,释放内存(deleteArrayFree())。

另见

数据类型类型密封和扩展变量初始化可见范围和变量使用期创建和删除对象