什么时候在C中需要malloc?

wam*_*amp 13 c malloc

我想所有都malloc(sizeof(structure)) 可以这样替换:

char[sizeof(structure)]
Run Code Online (Sandbox Code Playgroud)

那么什么时候malloc需要?

Mat*_*lia 22

  • 当你不知道你需要多少种对象时(例如链表元素);
  • 当你需要在运行时只知道大小的数据结构时(例如基于未知输入的字符串); 通过在C99中引入VLA可以稍微减轻这一点,但请看下一点:
  • 当你在编译时知道它们的大小(或者你可以使用VLA),但它对于堆栈来说太大了(通常最多只有几MB)并且使这样的事物变得全局化是没有意义的(例如,操纵的大向量) ;
  • 当你需要一个对象的生命周期不同于自动变量时,这些自动变量是范围限制的(=>当执行从声明它们的范围退出时被销毁)可以有(例如必须在具有不同生命期的不同对象,并且在没有人使用它时被删除).

请注意,没有动态内存分配并不是完全不可能的(例如,整个rockbox项目几乎没有它可以工作),但是在某些情况下,您实际上需要通过使用大型静态缓冲区并编写自己的分配器来模拟它.

顺便说一句,在C++中你永远不会使用malloc()/ free(),而是运算符newdelete.


相关:一个试图在没有工作的情况malloc被证明是一个大混乱.


hay*_*lem 8

您将使用malloc动态分配内存,原因如下:

  • 你不知道在编译时需要多少内存,
  • 您希望以后能够重新分配内存(例如使用realloc),
  • 您希望能够更早地丢弃分配的内存,而不是等待基于变量范围的释放.

我可以看出你的观点.您可以认为您可以始终对所有这些使用声明性语法,甚至使用变量来声明内存空间的大小,但这会:

  • 不标准,
  • 给你少一点控制,
  • 可能会使用更多内存,因为您需要复制而不是重新分配.

您可能会及时了解这一点,不用担心.

此外,您应该尝试了解有关内存模型的更多信息.使用动态分配和使用静态分配时,不要使用相同的内存空间.

对于第一个指针,请访问:


友好的建议:我不知道您是否在*NIX或Windows上开发C语言,但无论如何使用gcc,我建议您在自学时使用以下编译标志:

  -Wall -ansi -pedantic -Wstrict-prototypes
Run Code Online (Sandbox Code Playgroud)


Nav*_*een 0

当您不知道在编译时分配多少内存时。举一个非常简单的程序,您需要将用户输入的数字存储在链接列表中。这里你不知道用户将输入多少个数字。因此,当用户输入一个数字时,您将为其创建一个节点malloc并将其存储在链接列表中。