定义Linux中C程序允许的最大char []数组大小

时间:2019-05-15 17:14:16

标签: c arrays memory memory-management size

我已经用C语言编写了涉及局部char数组的代码,但我读到如果数组的大小太大,则可能会发生分段错误。

在我的代码中,我包括以下行:

#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 :(得分:0)

您需要修改stack的大小。 -s是使用ulimit设置堆栈大小的选项。

当前在您的系统上为4 MB。

stack size              (kbytes, -s) 4096

例如:

ulimit -s unlimited 
//sets stack size to ulimited

答案 1 :(得分:0)

Printf向您显示-1,因为%d的格式是有符号整数,小于无符号(通常为1位)。函数本地字符数组放在堆栈上,这就是您要查找的值。

答案 2 :(得分:0)

Linux有一个虚拟内存管理器,该虚拟内存管理器将根据需要分配块,将块交换到磁盘,否则尝试使系统看起来可以分配给特定任务的内存数量没有预设限制。但这就像一张美国运通卡,没有“预设消费限额”。如果您尝试为法拉利充电,他们会打电话给您,并询问“ WTF?”。实际上,所有内存都是有限的,因此内存技巧在某些时候会失败。不幸的是,没有实际的方法可以事先知道这一点。这取决于系统上正在运行的其他内容,磁盘的大小和速度,操作系统设置以及其他因素。

实际上,在计算机中分配接近物理RAM数量的阵列很可能会引起问题(速度减慢,如果没有其他问题)。因此,这可能是一个合理的限制。内存映射文件可能是要考虑的另一件事,但现实有时也会影响它们的性能。