В Linux вы получаете ошибку сегментации, если ваш код пытается писать мимо стека.
Размер стека - это свойство, передаваемое между процессами. Если вы можете прочитать или изменить его в оболочке, используя такие команды, как ulimit -s (в sh, ksh, zsh) или limit stacksize (tcsh, zsh).
Из программы размер стека можно узнать с помощью
#include <sys/resource.h>
#include <stdio.h>
int main() {
struct rlimit l;
getrlimit(RLIMIT_STACK, &l);
printf("stack_size = %ld\n", l.rlim_cur);
return 0;
}
Я не знаю стандартного способа получить размер доступного стека.
Стек начинается с argc, за которым следует содержимое argv и копия среды, а затем ваши переменные. Однако, поскольку ядро может рандомизировать расположение начала стека, и могут быть некоторые фиктивные значения выше argc, было бы неправильно предполагать, что у вас есть l.rlim_cur байтов, доступных ниже &argc.
Один из способов узнать точное местоположение стека - просмотреть файл /proc/1234/maps (где 1234 - это идентификатор процесса вашей программы). Как только вы узнаете эти границы, вы можете вычислить, какая часть вашего стека используется, посмотрев на адрес последней локальной переменной.
person
adl
schedule
14.10.2008