Определение максимального размера массива char [], допустимого для программ на C в Linux

Я сделал код на C, включающий локальные массивы символов, но я читал, что если размер массивов слишком велик, то может возникнуть ошибка сегментации.

В своем коде я включил следующую строку:

#include <stdint.h>

И я также добавил в раздел вывода:

Е ( "% d", SIZE_MAX);

После выполнения я вижу -1, который предлагает мне Безлимитный.

Затем я продолжаю в консоль и проверил мои пределы:

bash-3.1# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 8189
max locked memory       (kbytes, -l) 4096
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 4096
cpu time               (seconds, -t) unlimited
max user processes              (-u) 8189
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

И я вижу много "неограниченных".

Я ищу в правильном месте, чтобы определить максимально допустимый размер для массива char []? Если да, то какое значение мне нужно изменить?

Всего 4 ответа


Вам нужно изменить размер stack . -s это опция для установки размера стека с помощью ulimit .

В вашей системе в настоящее время это 4 мегабайта.

stack size              (kbytes, -s) 4096

Пример:

ulimit -s unlimited 
//sets stack size to ulimited

Printf показывает вам -1 поскольку формат %d представляет собой целое число со знаком, которое меньше, чем беззнаковое (обычно на 1 бит). Массивы локальных символов функции помещаются в стек, так что это значение, которое вы ищете.


В Linux есть менеджер виртуальной памяти, который будет распределять блоки по мере необходимости, выгружать блоки на диск и, в противном случае, пытаться заставить систему выглядеть так, как будто нет заранее установленного ограничения на количество памяти, которое вы можете выделить для конкретной задачи. Но это походит на карту American Express с "без предварительно установленного предела расходов". Если вы попытаетесь зарядить Ferrari, они позвонят вам и спросят «WTF?». В действительности вся память конечна, и поэтому уловки памяти потерпят неудачу в некоторый момент. К сожалению, нет практического способа узнать заранее, что это за точка. Это зависит от того, что еще работает в системе, размера и скорости вашего диска, настроек ОС и прочего.

С практической точки зрения выделение массива, близкого к объему физической оперативной памяти в машине, может вызвать проблемы (замедления, если ничего не происходит). Так что это может быть разумным пределом для рассмотрения. Файлы с отображением в памяти могут быть другой вещью, которую нужно учитывать, но в какой-то момент реальность также влияет на их производительность.


В обычной системе комплиментов для двоих в SIZE_MAX установлены все биты. В знаке -1 также установлены все биты.

Чтобы действительно понять, используйте это:

printf("%llu
", SIZE_MAX);

SIZE_MAX-1 - теоретический максимальный размер массива char[] , однако реальный предел часто намного меньше.


Есть идеи?

10000