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

前端 未结 3 907
时光说笑
时光说笑 2021-02-12 08:10

My question is pretty simple and straightforward: if I have e.g. 1MB of RAM assigned to the program\'s stack, can I get the addresses of the start and the end, or the start and

相关标签:
3条回答
  • 2021-02-12 08:35

    You should question your assumptions about stack layout.

    Maybe the stack doesn't have just one top and bottom

    Maybe it has no fixed bottom at all

    Clearly there's no portable way to query concepts which are not portable.

    From Visual C++, though, you can use the Win32 API, depending on Windows version.

    On Windows 8 it is very easy, just call GetCurrentThreadStackLimits

    Earlier versions need to use VirtualQueryEx and process the results somewhat. Getting one address in the stack is easy, just use & on a local variable. Then you need to find the limits of the reserved region that includes that address. Joe Duffy has written a blog post showing the details of finding the bottom address of the stack

    0 讨论(0)
  • 2021-02-12 08:45

    On Windows before 8, implement GetCurrentThreadStackLimits() yourself:

    #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
    
    0 讨论(0)
  • 2021-02-12 08:46

    GetCurrentThreadStackLimits seems to do what you're looking for, getting the lower/upper boundaries of the stack into pointer addresses:

    ULONG_PTR lowLimit;
    ULONG_PTR highLimit;
    GetCurrentThreadStackLimits(&lowLimit, &highLimit);
    

    Looks like it is only available on Windows 8 and Server 2012 though.

    Check the MSDN

    0 讨论(0)
提交回复
热议问题