【发布时间】:2015-04-28 13:29:55
【问题描述】:
在 Linux 下执行二进制 (C/C++) 时,
- 如何为进程初始化堆栈?
- 堆栈如何增长以及达到什么限制?
- 使用
ulimit,我可以有一个限制数,使用setrlimit,我可以修改它,但是到什么限制,我怎么确定呢? - 是否为所有正在执行的进程分配了相同的堆栈大小?
正如您在下面的代码中看到的那样,我递归地调用了 func() 仅用于推送操作,并且堆栈增长到大约 8 MB。它崩溃了(堆栈溢出!)。
void func()
{
static int i=0;
int arr[1024]={0};
printf("%d KB pushed on stack!\n",++i*sizeof(int));
func();
}
int main()
{
func();
return 0;
}
output snippet:
8108 KB pushed on stack!
8112 KB pushed on stack!
8116 KB pushed on stack!
8120 KB pushed on stack!
Segmentation fault (core dumped)
- 这些大约 8 MB 的内存是从哪里来的?
【问题讨论】:
-
各位大大,这不是太笼统,有明确具体的答案等着大家给出。
-
@Leushenko 我也在等别人给我不知道。请回答。
-
请注意,打印输出实际上应该是
%d KB pushed on stack\n", ++i * 4)- 因为每个 1024 个整数的数组是 4KB。