我能在C/C++中得到堆栈的极限吗
Can I get the limits of the stack in C / C++?
我的问题非常简单明了:如果我有1MB的RAM分配给程序堆栈,我能得到开始和结束的地址,或者开始和长度吗?
我正在使用Visual Studio 2013。
您应该质疑您对堆栈布局的假设。
也许堆栈没有一个顶部和底部
也许它根本没有固定的底部
显然,没有可移植的方法来查询不可移植的概念。
不过,在Visual C++中,您可以使用Win32 API,具体取决于Windows版本。
在Windows 8上,这很容易,只需调用GetCurrentThreadStackLimits
早期版本需要使用VirtualQueryEx
并对结果进行一些处理。在堆栈中获取一个地址很容易,只需对局部变量使用&
即可。然后,您需要找到包含该地址的保留区域的限制。Joe Duffy写了一篇博客文章,展示了查找堆栈底部地址的详细信息
GetCurrentThreadStackLimits
似乎可以实现您想要的功能,将堆栈的下/上边界转换为指针地址:
ULONG_PTR lowLimit;
ULONG_PTR highLimit;
GetCurrentThreadStackLimits(&lowLimit, &highLimit);
看起来它只在Windows 8和Server 2012上可用。
检查MSDN
在8之前的Windows上,自己实现GetCurrentThreadStackLimits():
#include <windows.h>
#if _WIN32_WINNT < 0x0602
VOID WINAPI GetCurrentThreadStackLimits(LPVOID *StackLimit, LPVOID *StackBase)
{
NT_TIB *tib = (NT_TIB *) NtCurrentTeb();
*StackLimit = tib->StackLimit;
*StackBase = tib->StackBase;
}
#endif
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++向量的极限
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 我能在C/C++中得到堆栈的极限吗