Подтвердить что ты не робот

Могу ли я получить пределы стека в C/С++?

Мой вопрос довольно прост и прост: если у меня есть, например, 1 МБ ОЗУ, назначенной стеку программ, могу ли я получить адреса начала и конца, или начало и длину?

Я использую Visual Studio 2013.

4b9b3361

Ответ 1

Вы должны задать вопрос о своих предположениях о расположении стека.

Может быть в стеке нет только одного верхнего и нижнего уровня

Возможно, у него нет фиксированного дна вообще

Ясно, что нет портативного способа запроса понятий, которые не являются переносимыми.

Из Visual С++, однако, вы можете использовать Win32 API, в зависимости от версии Windows.

В Windows 8 это очень просто, просто позвоните GetCurrentThreadStackLimits

Более ранние версии должны использовать VirtualQueryEx и обрабатывать результаты несколько. Получение одного адреса в стеке легко, просто используйте & для локальной переменной. Затем вам нужно найти пределы зарезервированного региона, который включает этот адрес. Джо Даффи написал сообщение в блоге, в котором показаны детали поиска нижнего адреса стека

Ответ 2

GetCurrentThreadStackLimits похоже, делает то, что вы ищете, получая нижние/верхние границы стека в адрес указателя:

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

Похоже, он доступен только для Windows 8 и Server 2012.

Проверьте MSDN

Ответ 3

В Windows до 8 реализовать 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