我能在C/C++中得到堆栈的极限吗

Can I get the limits of the stack in C / C++?

本文关键字:堆栈 极限 C++      更新时间:2023-10-16

我的问题非常简单明了:如果我有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