将数组放在堆上而不是堆栈上,是否可以消除分段错误的可能性

  • 本文关键字:分段 可能性 错误 是否 堆栈 数组 c
  • 更新时间 :
  • 英文 :

这是我的问题。假设我的数组大小为10,当我循环遍历并将数组填充到13时,我遇到了分段错误,因为我破坏了堆栈上的一些重要信息。如果我把它放在堆上,我能免受分割错误的影响吗?这更多的是一个概念问题。

否。如果超出了分配的空间,则说明您使用的内存不属于应用程序,或者属于应用程序的其他部分。

然后会发生什么是不确定的。在任何一种情况下,如果仅超过三个字节直接导致分段错误,我都会感到惊讶——页面粒度并没有那么小。Seg故障是处理器和操作系统的一个功能,而不是C语言,当您访问未分配给进程的内存时,就会发生Seg故障。

在堆栈缓冲区溢出的情况下,您很可能会损坏当前或调用函数中的一些相邻数据,如果发生seg错误,则是由于对损坏的数据采取了操作,例如向程序计数器弹出无效的返回地址,而不是溢出本身。

类似地,如果超出堆分配,结果取决于损坏的内容以及随后的使用方式。堆损坏尤其隐蔽,因为错误的结果可能未被检测到(潜在的(,或者在代码的某个不相关区域发生实际错误后很长一段时间内导致失败——通常是当您试图释放或分配堆结构已被破坏的其他分配时。您损坏的内存可能是其他现有分配的一部分,只有当使用损坏的数据时,错误才会显现出来。

您观察到的错误完全是不确定的-在您描述的情况下,立即发生seg故障可能不太可能,但事实上,这是您所希望的最好结果,因为所有其他可能的故障表现都特别难以调试。堆栈数据溢出导致的故障可能更本地化-通常你会在函数中看到损坏的数据,或者函数在返回时会失败,而堆错误通常不那么明显,因为损坏的数据可能与应用程序中的任何代码相关联。如果该代码没有运行,或者不经常运行,您可能永远不会观察到任何故障,

问题的"解决方案"不是编写溢出的代码——它总是错误的,使用不同类型的内存分配不会让你免于这种情况。使用简单地"隐藏"错误或使其不那么明显或确定的编码实践不是一个好的策略。

最新更新