跳至内容

Local Variables

局部变量

函数内部声明的变量是局部的。局部变量的作用域仅限于其声明的函数范围内。局部变量可以通过任何表达式的结果进行初始化。每次调用函数都会初始化一个局部变量。局部变量存储在相应函数的内存区域中。

示例:

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

变量的作用域是程序中可以引用该变量的部分。在块内部声明的变量(在内部级别)具有作为其作用域。块作用域从变量声明开始,到最后一个右大括号结束。

在函数开头声明的局部变量也具有块的作用域,以及作为局部变量的函数参数。任何块都可以包含变量声明。如果块是嵌套的,并且外部块中的标识符与内部块中的标识符名称相同,则外部块的标识符将被隐藏,直到内部块的操作结束。

示例:

void OnStart()
  {
//---
   int i=5;      // local variable of the function
     {
      int i=10;  // function variable
      Print("Inside block i = ",i); // result is  i=10;
     }
   Print("Outside block i = ",i);  // result is  i=5;
  }

这意味着当内部块运行时,它只能看到自己局部标识符的值,而不能看到外部块中具有相同名称的标识符的值。

示例:

void OnStart()
  {
//---
   int i=5;      // local variable of the function
   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
*/

作为静态声明的局部变量具有块的作用域,尽管它们从程序开始时就存在。

在每个MQL4程序中,都会分配一个称为栈的特殊内存区域来存储自动创建的局部函数变量。所有函数都分配了一个栈。默认栈大小为256kb,可以通过 #property stacksize编译器指令来管理栈大小。

静态局部变量与其他静态和全局变量存储在同一位置——在一个与栈分开的特殊内存区域中。动态创建的变量也使用与栈分开的内存区域。

每次调用函数时,都会在栈上为内部非静态变量分配一个位置。退出函数后,内存可以再次使用。

如果先调用第一个函数,然后调用第二个函数,那么第二个函数将占用剩余栈内存所需的空间来存放其变量。因此,在使用包含的函数时,栈内存将依次被每个函数占用。这可能导致在某个函数调用过程中内存不足,这种情况称为栈溢出。

因此,对于大型局部数据,最好使用动态内存——在进入函数时,在系统中分配所需的内存(newArrayResize()),在退出函数时,释放内存(deleteArrayFree())。

另请参阅

数据类型类型的封装和扩展性变量的初始化变量的可见性作用域和生命周期对象的创建和删除

最后更新于