【问题标题】:Stack overflow in CC中的堆栈溢出
【发布时间】:2014-12-28 17:53:06
【问题描述】:

如果堆上没有剩余内存,malloc 将返回 NULL。

堆栈溢出的行为是否在 C 中定义?

Wikipedia 暗示它可能会导致段错误,至少在无限递归的情况下,但会发生其他事情吗?

同样在许多托管环境中,运行时不允许您在堆栈上创建数组。这是否意味着我们也应该在本机代码中避免它以防止堆栈溢出,至少在运行时确定数组的大小时?

【问题讨论】:

  • C 规范确实提到了“堆栈”或“堆”。因此,未指定堆或堆栈上的空间不足。
  • @JoachimPileborg 但是规范说malloc() 如果无法分配,可以返回NULL。如果您用完 malloc() 使用的任何内存(我们可以选择将其称为“堆”),这就是预期的结果。这个问题的重点是,无法为函数中的局部变量分配内存没有什么类似的。
  • 任何环境都不可能禁止在栈上创建数组。数组和非数组变量只是内存,环境无法知道内存将如何使用。
  • @Barmar 是的,我知道。我的问题是这是否是一个坏主意
  • 只要将局部变量保持在合理的大小(每个函数调用几 KB),就可以了。

标签: c stack-overflow


【解决方案1】:

当您发生堆栈溢出时,您正在写入未分配的内存。 在未分配内存中写入的行为是未定义的,但它可能会使您的程序崩溃。

【讨论】:

  • 因此操作系统为堆栈留出固定数量的内存,然后在堆栈溢出时堆栈指针会在此内存的末尾徘徊并尝试将新数据压入堆栈将导致尝试写入可能不允许进程访问的内存?
【解决方案2】:

这是否意味着我们也应该在本机代码中避免它以防止 堆栈溢出,至少当数组的大小确定为 运行时间?

你为什么要避免它?我不会避免它,因为有一个好处 堆栈声明的数组与动态数组相比是 您不必为内存管理问题而烦恼(例如,无需free)。这是一个很大的优势。

在极少数情况下,如果您想要的数组太大而无法放入堆栈, 您可以使用动态数组。堆栈大小也有一些估计,例如在 Windows 上,Visual Studio 的默认堆栈大小为 1MB。你可以考虑这个。这个尺寸 如果我没记错也可以增加。

【讨论】:

  • "在 Visual Studio 中默认堆栈大小为 1MB...如果我没记错的话,这个大小也可以增加。"那么这是在进程的二进制文件中控制的吗?这也是每个线程或线程之间 1MB 的空间吗?
  • @GeorgeSimms: stackoverflow.com/questions/1825964/… 这里有一些信息。您可以在其他地方阅读更多详细信息
猜你喜欢
  • 2012-12-20
  • 2011-03-02
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2010-09-22
相关资源
最近更新 更多