【问题标题】:Malloc in a loop, are all allocated blocks consecutive?循环中的malloc,所有分配的块都是连续的吗?
【发布时间】:2011-11-21 19:54:08
【问题描述】:

我有一个使用本地数组的函数。我想返回一个指向它的指针,但当然不能这样做,除非手动分配内存。因此我想知道分配是否像这样:

for(i = 0; i < 26; i++)
{
    llist[i] = malloc(sizeof(SomeStruct));
}

以后可以像这样释放:

// (where ptr is a pointer to the first allocation in llist)

for(i = 0; i < 26, i++)
{
    free(ptr);
    ptr += sizeof(SomeStruct);
}

编辑:

看来我做不到。有没有什么方法可以释放所有内存,只给一个指向第一个元素的指针?还是我应该完全采取不同的方法?

【问题讨论】:

  • 你不能在循环外做malloc(sizeof(SomeStruct))*26吗?
  • @K-ballo 澄清一下,我是要 malloc(sizeof(SomeStruct)) * 26; 还是 malloc(sizeof(SomeStruct) * 26);
  • 当然应该是malloc(sizeof(SomeStruct) * 26),我错了。

标签: c memory-management pointers


【解决方案1】:

不,它不能。不能保证这些块是连续分配的。事实上,几乎可以肯定它们与我见过的所有现代实现都不一样。大多数存储块的大小以及每个块之前的其他信息。此外,如果您的内存碎片化,这些块可能会在其他数据之间的可用空间中的任何地方结束,那里没有足够的空间来连续放置它们。

【讨论】:

  • 该死。有没有什么办法可以在以后只给第一个元素的指针释放所有块?
  • 如果我这样做llist = malloc(sizeof(SomeStruct) * 26); 会不会让llist 指向整个内存块,而不是第一项?
  • 是的。因此,您将llist 设为SomeStruct* 并使用[] 访问它,就像您现在一样,除了不需要额外的取消引用,因此它将是llist[i].member 而不是llist[i]-&gt;member
  • 啊,有趣。我不知道你能做到这一点(C 新手)。感谢您的提示。
【解决方案2】:

不,你不能。在第一个空白空间malloc 发现它可能只放置一个结构。如果是这样,下一个块将被放置在其他地方。

【讨论】:

    【解决方案3】:

    取决于您在循环中执行的操作。有些函数会在内部分配缓冲区,这意味着 malloc() 可以在你背后调用。在您的简单循环中,值应该是连续的。同样,一旦你投入了多线程,所有的赌注都在窗外,因为另一个线程中的某些东西也可能会 malloc() 内存。

    实际分配点还取决于您的内存碎片程度。可能没有足够的连续块来处理您的请求,因此实际分配可能来自可用空间中的任何位置。

    【讨论】:

    • 在极少数实现中这些是连续的。即使在发布版本中,堆通常也会跟踪每个分配之间的分配大小。
    • 应该将“应该”改为“可以”或“可能”。 malloc() 没有承诺分配给定块的位置,因此您不得依赖顺序分配的块按顺序定位。
    猜你喜欢
    • 2010-10-12
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2021-01-10
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多