我试图在this question上帮助OP。
我发现下面的代码会导致分段错误,即使堆栈设置为2000 KB也是如此。
int main ()
{
int a[510000];
a[509999] = 1;
printf("%d", a[509999]);
return 0;
}
如您所见,该数组为510000 x 4
bytes = 2040000
字节。
使用ulimit命令将堆栈设置为2000 KB(2048000字节):
根据这些数字,应用程序有空间存储数组,但随机返回分段错误。
有什么想法吗?
答案 0 :(得分:5)
有几个原因导致你无法做到这一点。有些东西已经在使用你的部分堆栈了。
main
不是你堆栈中的第一件事。有一些函数由真正的入口点,动态链接器等调用,它们在main之前,它们都可能正在使用一些堆栈。
此外,可能会有一些东西通常放在堆栈顶部以设置执行。我知道的许多系统都将argv和所有环境变量中的所有字符串放在堆栈顶部(这就是为什么main不是入口点,通常代码在main之前运行,设置环境变量,argv为main)。
最重要的是,如果你的系统这样做,可以故意浪费掉一部分堆栈以增加ASLR的随机性。
在调试器中运行程序,在main处添加断点,查找堆栈寄存器的值并检查其上方的内存(请记住,除非您使用的是奇怪的架构,否则堆栈最有可能会增长)。我打赌你会在那里找到很多指针和字符串。我刚刚在linux系统上做了这个,因为我怀疑我的所有环境变量都在那里。
Unix上的资源限制(ulimit)的目的从来没有真正地将事情微观管理到一个字节/微秒,它们只是为了阻止你的程序完全疯狂并用它取下整个系统。看到它们不是红灯,在正确的道路上停下标志,将它们视为跑道区域和赛道上的防撞栏。
答案 1 :(得分:0)
如果您仍想访问数组中的int位置,请尝试使用main来编译代码。这不会调用Selection