// the malloc style, which returns a pointer:
struct Cat *newCat = malloc(sizeof(struct Cat));
// no malloc...but isn't it actually the same thing? uses memory as well, or not?
struct Cat cat = {520.0f, 680.0f, NULL};
基本上,我可以通过这两种方式获得初始化结构。我的猜测是:它是一样的,但是当我使用malloc时我也必须释放()。在第二种情况下,我不必考虑内存,因为我不调用malloc。也许
我何时应该使用malloc样式,何时使用另一个?
答案 0 :(得分:6)
它不是相同的内存,前者在堆上分配,后者在堆栈上分配。
Heap使您可以手动控制创建和删除,但有利有弊:您可以将指针传递给其他人,但您也必须将其删除。
每当第二种情况发生时,都是首选。
答案 1 :(得分:4)
只有在需要结构超过当前函数的生命周期时,才应使用malloc
函数。 malloc
函数将从堆中分配内存,这使得它可以长期存在。如果您需要在退出函数后存储项目(例如在共享列表中),这将非常有用。
它还引入了额外的开销,包括......
另一方面,第二种语法在堆栈上分配内存。这是有益的,因为这里的内存是自动的,因为你不必考虑它。当函数退出时,可以释放存储器。此外,它允许单个语句进行分配和初始化。
此规则的一个例外是结构体足够大,可能导致堆栈溢出。堆栈是一种有限的资源,大型结构可能导致它被耗尽。一般来说,堆有更多的空间,可以轻松容纳这些较大的结构。
答案 2 :(得分:3)
首先,第一个变体不初始化任何结构。它只是分配一块原始内存,足以容纳struct Cat
类型的对象。内存仍然未初始化(包含垃圾)。第二个变体会将结构中的每个字段初始化为特定值。
其次,第一个变体创建一个无名[和未初始化] struct Cat
对象,其中分配存储持续时间。该对象将一直存在,直到您使用free
显式释放它(或直到程序结束)。第二个变体创建一个带有自动存储持续时间的命名对象cat
- 它将在其声明性区域的末尾自动释放(在包含块的末尾)。
第三,在实践中,这两个变体在不同类型的存储器中创建对象。第一个变体在堆中创建对象,而第二个变体通常在堆栈中创建它。
关于什么时候使用这个或那个,这里有很多关于这个问题的答案。 This thread有一些答案和大量链接。
答案 3 :(得分:2)
差异(已经说过的其他几点)是你没有初始化第一种情况下的所有结构(malloc);你只需要记住它就可以了。在第二种情况下,您有内存和初始化。
答案 4 :(得分:1)
除了其他非常有用的答案之外,还有一个关键的区别。
malloc()方法使结构成员保持未初始化状态。您必须在单独的步骤中初始化它们。