用这些策略初始化这个结构有什么区别?

时间:2010-06-01 16:57:58

标签: c

// 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样式,何时使用另一个?

5 个答案:

答案 0 :(得分:6)

它不是相同的内存,前者在堆上分配,后者在堆栈上分配。

Heap使您可以手动控制创建和删除,但有利有弊:您可以将指针传递给其他人,但您也必须将其删除。

每当第二种情况发生时,都是首选。

答案 1 :(得分:4)

只有在需要结构超过当前函数的生命周期时,才应使用malloc函数。 malloc函数将从堆中分配内存,这使得它可以长期存在。如果您需要在退出函数后存储项目(例如在共享列表中),这将非常有用。

它还引入了额外的开销,包括......

  • 强制对代码进行更多错误检查
  • 分离和初始化结构
  • 跟踪记忆的过程中的开销

另一方面,第二种语法在堆栈上分配内存。这是有益的,因为这里的内存是自动的,因为你不必考虑它。当函数退出时,可以释放存储器。此外,它允许单个语句进行分配和初始化。

此规则的一个例外是结构体足够大,可能导致堆栈溢出。堆栈是一种有限的资源,大型结构可能导致它被耗尽。一般来说,堆有更多的空间,可以轻松容纳这些较大的结构。

答案 2 :(得分:3)

首先,第一个变体不初始化任何结构。它只是分配一块原始内存,足以容纳struct Cat类型的对象。内存仍然未初始化(包含垃圾)。第二个变体会将结构中的每个字段初始化为特定值。

其次,第一个变体创建一个无名[和未初始化] struct Cat对象,其中分配存储持续时间。该对象将一直存在,直到您使用free显式释放它(或直到程序结束)。第二个变体创建一个带有自动存储持续时间的命名对象cat - 它将在其声明性区域的末尾自动释放(在包含块的末尾)。

第三,在实践中,这两个变体在不同类型的存储器中创建对象。第一个变体在堆中创建对象,而第二个变体通常在堆栈中创建它。

关于什么时候使用这个或那个,这里有很多关于这个问题的答案。 This thread有一些答案和大量链接。

答案 3 :(得分:2)

差异(已经说过的其他几点)是你没有初始化第一种情况下的所有结构(malloc);你只需要记住它就可以了。在第二种情况下,您有内存和初始化。

答案 4 :(得分:1)

除了其他非常有用的答案之外,还有一个关键的区别。

malloc()方法使结构成员保持未初始化状态。您必须在单独的步骤中初始化它们。