1、用数组静态获得一段连续的存储空间,大小当然有限制了。
理论上来说没有限制,但是内核一般配置允许每个进程拥有有限的内存空间,可以用系统调用函数getrlimit(int resource, struct rlimit *rlim)获得系统的资源限制。系统的资源限制分为软件限制和硬件限制,软件限制最大值不能超过硬件限制。数组静态获得的存储空间是分配在stack,只要知道stack的限制就知道答案了。可以使用如下代码获得:
struct rlimit resource_limit;
getrlimit(RLIMIT_STACK, &resource_limit);
printf("STACK: soft_limit - %ld hard_limit - %ld\n", resource_limit.rlim_cur, resource_limit.rlim_max);
我的系统上软件限制是10485760byte,已经足够了。
2.分配大数量的数组,若是系统找不到该大小的一段连续的存储空间,系统就会产生一个SIGSEGV信号,这时调用函数int sigaltstack(const stack_t *ss, stack_t *oss)来处理这个信号。sigaltstack储存信号SIGSEGV到一个alternate stack结构ss中,内核会先于进程运行前检查这个信号。
补充:至于你说的malloc限制为65536byte,可能有些片面,我的系统上申请500M都没有问题^_^当然这和系统限制有关,因为我使用了ulimit -c unlimited命令取消了限制。但是就32系统来说一般默认限制最低是16M,最大是64M,可以用ulimit -d命令改变限制范围。
楼上说的是普通的局部变量的数组吧,要是静态的或者全局的数组,就应该不是stack的限制了吧
确实是只针对普通的局部变量的数组,对于静态的或者全局的数组的空间分配是在DATA段。Unix/Linux32位系统用户使用虚拟内存最多可以3G,实际上DATA段+HEAP段+TEXT段占有的最大空间是0x08048000~0x40000000,除去HEAP段和TEXT段以外,就是DATA段的空间,当然就是理论上能获得的静态的或者全局的数组的最大空间。HEAP段占用的空间就是malloc系列函数申请的空间,至于TEXT段占有的空间相对较小,可以忽略^_^