通过 ulimit -s 修改堆栈大小

use*_*ser 7 c c++ application-development

当我输入ulimit -s终端时,它显示8192. 这是否意味着在我的 C 代码中我只能有 8192 字节的局部变量?

我很困惑哪个堆栈大小。ulimit -s当我们修改它的值时会改变吗?

Jan*_*ary 11

首先,它是 8192字节,而不是字节。此外,堆栈是一回事,变量是另一回事,而堆又是另一回事。例如,请参阅堆栈和堆之间差异的解释此页面。据我所知,堆栈用于局部变量和短期变量,使用堆栈还是堆取决于编译器。

据我所知,如果您使用[mc]alloc和朋友分配内存,则不会触及堆栈,并且限制不成立。

但是,是的,在ulimit -s等于 8192处尝试以下操作将导致分段错误:

#include <stdlib.h>

int main() {
  char foo[10000000] ;
  foo[0] = 'a' ;
  exit( 0 ) ;
}
Run Code Online (Sandbox Code Playgroud)

在这里,变量foo太大了。

$ gcc test.c
$ ./a.out
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

但是,如果您更改 ulimit(例如ulimit -s 16000),它将起作用。

  • 我如何知道我的堆栈大小限制?我的意思是,在 `ulimit -s` 之后我可以写的最大数字是多少? (2认同)