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

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

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

#include <stdint.h>

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

printf ("% 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 []?Если да, то какое значение мне нужно изменить?

Ответы [ 3 ]

0 голосов
/ 15 мая 2019

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

0 голосов
/ 15 мая 2019

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

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

0 голосов
/ 15 мая 2019

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

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

stack size              (kbytes, -s) 4096

Ex:

ulimit -s unlimited 
//sets stack size to ulimited
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...