2010-09-08 94 views
1

大部分体系结构具有存储器映射,其中用户应用程序的增长朝 其中堆栈增长至相反的方向下存储器。我想知道,当我写的所有的应用程序 空间和被带走,即堆栈指针和应用程序试图写入内存中的同 区这么大的C-程序什么 是怎么回事?我假设在C中发生了类似于分段错误的事情?有没有 任何处理器支持,试图避免这样的问题发生?堆栈指针VS应用

感谢

回答

1

没有,在C你可以走出记忆,你只能直接如果你实际检查的malloc等人返回值注意。否则,您可能会在某处解除引用空指针,导致您的应用崩溃。但可能有可能没有直接的可见迹象,只有你的记忆被无声地破坏。由于应用程序的内存空间由应用程序本身管理,因此处理器/操作系统无法检测到此类错误。在现代操作系统中,操作系统本身和其他应用程序的内存空间受到应用程序的保护,因此如果您不小心尝试写入内存空间以外的内存,则可能会出现分段错误。但是在你自己的记忆空间里,保护你的记忆取决于你自己。

1

堆栈指针是有限的。一旦尝试超出允许范围,您通常会得到异常或中断,导致程序终止。这通常发生在失控递归函数中。

类似地,对于堆栈空间被保留,而且给堆分配不可访问。当你尝试做一个堆分配(mallocnew)没有足够的空间,分配器通常会返回NULL或抛出一个OutOfMemory例外。

我,说答案不同意“不会有直接的明显迹象,只有你的记忆被默默损坏。

你要么得到一个StackOverflowOutOfMemory,取决于其资源被疲惫不堪。

+0

我认为,除非你专门寻找异常,否则当你尝试在填满所有内容后尝试访问内存时,你会在某个时间段执行segfault/segv ...... – 2010-09-08 17:19:44

+0

Aaron:不会有任何内存损坏,空指针(或者它的一个小偏移量)将会失败而不会破坏内存,并且尝试执行超过堆栈末尾的调用也将失败:当OS异常/信号发生时,程序的状态将会生效你保证能够恢复。 – BCoates 2010-09-08 17:25:37

+0

@bcoats,我不是说会有,我只是指出你实际上并没有C中的“例外”,即没有投掷。这并不是非常重要的一点...... – 2010-09-10 21:55:43

1

Abelenky是正确的,现代建筑将捕获堆栈增长过去的一些限制比所有可用的地址空间小得多(这是很容易用一个简单的递归函数进行测试)

此外,“应用向下增长,堆增长up“并不真正描述多线程系统的内存映射,每个线程都有自己的堆栈,它有一个预先设置的最大值大小,堆是一个或多个单独映射的地址空间区域。

算出这个东西了,最简单的方法是将一个调试器附加到一个简单的测试程序;你可以看到你的进程在任何体面的内存区域使用。一定要查看你的库和代码的加载位置,以及多于一个线程值的堆栈。