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