一、局部变量
局部变量是在函数内部声明的变量,其作用范围仅限于声明它的函数内部。每次调用函数都会初始化局部变量,并存储在相应函数的内存区域。
1. 局部变量的范围
变量的范围是程序的一部分,在该部分中可以引用该变量。局部变量的范围从变量声明开始,到最终的右括号结束。
示例:
int CalculateSum()
{
int sum = 0;
...
return(sum);
}
2. 嵌套块中的变量
如果嵌套块中的标识符与外部块中的相同,则外部块标识符将被隐藏,直到内部块操作完成。
示例:
void Display()
{
int x = 5;
{
int x = 10;
Print("Inside block x = ", x); // 结果是 x=10;
}
Print("Outside block x = ", x); // 结果是 x=5;
}
3. 静态局部变量
静态局部变量具有块的范围,尽管它们自程序启动以来就存在。
二、栈
在每个MQL4程序中,为存储自动创建的局部函数变量分配了一个名为栈的特殊内存区域。所有函数分配一个栈。默认栈大小为256 kb,可以使用 #property stacksize 编译器指令管理栈大小。
1. 静态与动态变量的存储
静态局部变量存储在与其他静态和全局变量相同的地方。动态创建的变量也使用与栈分开的内存区域。
2. 栈内存的使用
每次调用函数时,栈上为内部非静态变量分配一个位置。退出函数后,内存可再次使用。
示例:
void LoopDisplay()
{
int y = 5;
for(int y = 0; y < 3; y++)
Print("Inside loop y = ", y);
Print("Outside the block y = ", y); // 结果 y=5
}
3. 栈溢出
当使用嵌套函数时,栈内存将为每个函数顺序占用,可能导致其中一个函数调用时内存不足,称为栈溢出。
4. 动态内存使用
对于大型局部数据,应使用动态内存 – 在进入函数时分配所需的局部内存,在退出函数时释放内存。
三、总结
局部变量和栈内存管理是编程中的关键概念。了解局部变量的作用范围、如何在嵌套块中工作,以及栈内存的分配和管理,对编写高效和可维护的代码至关重要。