C语言中的堆栈分配

8

在设计简单的C程序时,将所有或大部分内容都分配到堆栈上是否是不好的编程风格?


3
这取决于 "everything" 的含义是什么。 - Khaled Alshaya
1
如果你要用本地变量和参数来完成所有事情,那么你为什么一开始就要使用C语言呢?最好使用函数式语言,如ML、Haskell、Erlang等。 - JUST MY correct OPINION
你在考虑与之相反的是什么?全局变量还是堆上的数据? - Craig McQueen
1
@ttmrichter也许是因为C语言允许你完成任务吧?不过你的评论对OP有什么帮助呢? - qrdl
@JT:针对你的具体问题可能更有帮助,因为这个问题比较模糊。无论如何,所有的绝对都是错误的。 - Roger Pate
5个回答

15

如果您并不真正需要,那么使用堆分配内存是不好的编程风格,特别是在简单程序中。


2
如果可以的话,我会给这个点赞超过+1。堆栈分配是安全的,可以防止内存泄漏,并避免空指针或垃圾指针问题。尽可能使用它。 - kyoryu
1
+1 - 绝对没错 - 堆是比栈更复杂的数据结构,不仅在许多情况下是一个不必要的开销,而且还可能导致悬空指针、内存泄漏、堆破坏等潜在问题的不必要复杂性。当需要时没有理由避免使用堆,但肯定是一个“需要时”选项,而不是明智的默认选项。 - user180247
@qrdl 嗯,谢谢你的提示,但是在C语言中没有堆栈。 - user1831086
2
@qrdl:他不太友好地提到C标准并没有明确说明“栈”,而是用其他术语表述(例如,你可以实现没有栈的C)。 @rogue:用一个评论表达你的观点,不需要重复自己,而且一个完整、连贯和清晰的观点实际上可能会有所帮助,而不是这样的恶意评论。 - Roger Pate
3
我注意到Rogue最近回答了一个标记了“C”和“C ++”的问题,问“什么是分段错误”。他并没有特别急于说,“在C中没有分段错误”。我猜有时人们没有任何有用的事情要做。说到这个,我应该出去买香肠了。 - Steve Jessop

3

堆栈分配比堆分配更便宜。从堆栈中分配和释放只是在函数(或更确切地说:作用域)进入/退出时进行的简单计数器递增和递减。堆分配意味着在可能存在碎片化地址空间中查找足够大的内存块。因此,堆栈分配几乎总是更可取的。

不使用堆栈的主要原因如下:

  • 所需大小直到运行时才知道。
  • 需要大量内存(兆字节),这可能会在堆栈大小通常仅限于双位数兆字节的系统上造成问题。

2
或者如果需要大量内存(千字节),这可能会在系统上引起问题,其中堆栈大小通常限制为两位数的千字节(例如PC上的设备驱动程序或大多数嵌入式系统中的任何程序)。 - Dipstick

1

+1 提到可变长度数组(VLAs)。我在一个小项目中使用它们,它们大多数时候可以帮助避免堆分配。 - helpermethod

1
堆的主要优点是可以在其中动态分配内存。如果您不知道所需变量的大小:就使用堆。
如果您的程序很简单,您可能不需要在堆上分配变量;但选择并不取决于程序的复杂性,而取决于您对变量的需求。 如果您需要在整个工作流程中通过多个函数访问/修改变量,则最好使用堆。当您不再需要它时,可以释放它。 如果变量只是一个选项结构或计数器,则堆栈非常适合它。

0
不行,除非你有大小不固定的变量。这样的代码可能会很快导致堆栈溢出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接