我最近了解了堆栈,因此我正在尝试了解堆栈大小是多少以及溢出时会发生什么。我发现在 Unix 上默认堆栈大小为 8 MiB,这支持了我的发现,因为我无法在函数中声明大小大于或等于 8 MiB 的字符串main。但是,当我在其中声明变量时,main()它会影响其他函数。例如:
#include <stdio.h>
void foo(void)
{
long int size = 1024*1024*2;
char str[size];
str[size - 1] = 'a';
printf("%c\n", str[size - 1]);
}
int main(int argc, char** argv)
{
long int size = 1024*1024*6;
char str[size];
str[size - 1] = 'a';
printf("%c\n", str[size - 1]);
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码会导致分段错误,但如果我将字符串大小设置为 5 MiB,main()则不会出现分段错误。这是否意味着我的 C 程序无法为局部变量(所有函数)分配超过 8 MiB 的 RAM?如果是这样,堆栈的意义何在?
说我有一个这样的功能:
int myfunc()
{
int a;
// do something
int b;
// do something
}
Run Code Online (Sandbox Code Playgroud)
当我调用 myfunc() 时,b 的内存分配是否在 a 之后发生?或者是在第一个“做某事”完成后创建的。