我知道这是一个操作系统功能。但有没有办法通过C增加你的整体堆栈或堆大小? sbrk()用来改变数据段的大小吧?这是否意味着堆栈和堆?
答案 0 :(得分:3)
你提到sbrk(),所以我假设你的意思是Unix / Linux。 sbrk()将改变数据段的大小,但通常堆栈与数据段位于不同的内存空间,以防止人们覆盖堆栈并做恶事。通常,在使用shell中的ulimit启动程序运行之前,您将设置堆栈大小。
注意:不推荐使用sbrk()而使用malloc()。
Open Unix规范定义了(和Linux实现)getrlimit()和setrlimit()函数,它们还允许您使用系统限制。
答案 1 :(得分:1)
虚拟内存操作系统(使用带MMU的CPU时)会在需要时自动增加数据/堆栈段,最多可达到最大值。在POSIX系统上,可以使用setrlimit()配置最大值,如W. Craig Trader所说。 POSIX为限制定义了RLIMIT_DATA,RLIMIT_STACK和RLIMIT_AS。
malloc()在内部使用brk()来扩展/收缩数据段,或使用mmap()/ munmap()来请求/释放内存映射。当CPU试图访问分配的堆栈下面的内存时,堆栈会增长。
在没有MMU的系统(例如uClinux)上,可执行文件格式通常具有堆栈大小的字段(例如,查看BFLT文件格式)。