什么时候在C中需要malloc?
我认为所有malloc(sizeof(structure))
都可以这样替换:
char[sizeof(structure)]
然后什么时候需要malloc
?
- 当你不知道你需要多少对象时(例如链表元素);
- 当你需要在运行时只知道大小的数据结构时(例如基于未知输入的字符串); 通过在C99中引入VLA可以稍微减轻这一点,但请看下一点:
- 当你在编译时知道它们的大小(或者你可以使用VLA),但它对于堆栈来说太大了(通常最多只有几MB)并且使这样的事物全局化是没有意义的(例如操纵的大向量) ;
- 当你需要一个对象的生命周期不同于自动变量时,这些自动变量是范围限制的(=>当执行从声明它们的范围退出时被销毁)可以有(例如必须在具有不同生命期的不同对象,并且当没有人使用它时删除)。
请注意,没有动态内存分配并不是完全不可能的(例如,整个rockbox项目几乎没有动态内存),但在某些情况下,您实际上需要通过使用大型静态缓冲区并编写自己的分配器来模拟它。
顺便说一句,在C ++中你永远不会使用malloc()
/ free()
,但是运算符new
和delete
。
相关 :在没有malloc
的情况下尝试工作的案例已被certificate是一个大混乱。
您将使用malloc动态分配内存,原因如下:
- 你不知道在编译时需要多少内存,
- 您希望以后能够重新分配内存(例如使用realloc ),
- 您希望能够更早地丢弃分配的内存,而不是等待基于变量范围的释放。
我可以看出你的观点。 您可以认为您可以始终对所有这些使用声明性语法,甚至使用变量来声明内存空间的大小,但这会:
- 是非标准的,
- 给你少一点控制,
- 可能会使用更多内存,因为您需要复制而不是重新分配。
您可能会及时了解这一点,不用担心。
此外,您应该尝试了解有关内存模型的更多信息。 使用动态分配和使用静态分配时,不要使用相同的内存空间。
对于第一个指针,请访问:
- 动态内存分配
- 静态内存分配
- 堆栈与堆
- 堆栈与堆?
- C编程如何工作 – 动态数据结构
友情提示:我不知道您是否在* NIX或Windows上开发C语言,但无论如何使用gcc,我建议您在自学时使用以下编译标志:
-Wall -ansi -pedantic -Wstrict-prototypes
您应该阅读动态内存分配。 你显然不知道它是什么。
两者之间的主要区别在于,使用malloc()
分配的malloc()
存在的,直到您这样说。 静态记忆如char buff[10];
仅存在于函数范围内。
malloc是一个动态内存分配器,它可以帮助你根据需要为你的变量分配内存,从而减少内存的丢失。还有realloc()函数支持你通过它可以编辑你之前定义的所需内存通过malloc()或calloc()。 简而言之,我们可以说malloc()可用于管理内存空间并利用必要的内存而不会浪费它。
你永远不应该按照提议的方式这样做。 其他人已经告诉过你在堆上分配存储与在function堆栈上分配的区别。 但是,如果你在堆栈上分配,你应该只声明你的变量:
structure A = { /* initialize correctly */ };
作为一个(基本上)无类型的char
数组,没有任何意义或点。 如果您还需要该野兽的地址,请使用&A
的地址。
当你不知道在编译时分配多少内存。 采用一个非常简单的程序,您需要将用户输入的数字存储在链表中。 在这里,您不知道用户将输入多少个数字。 因此,当用户输入数字时,您将使用malloc
为其创建节点并将其存储在链接列表中。
如果使用char[sizeof(structure)]
而不是malloc
,那么我认为没有动态内存分配。
除了char[]
方法无法在运行时resize或确定大小这一事实外,您的数组可能无法正确对齐您要使用它的结构类型。 这可能导致未定义的行为 。