将sbrk分成2

时间:2017-02-01 13:16:33

标签: c malloc sbrk brk

要重新编码malloc函数,我执行a = tflearn.lstm(_input, 200) b = tflearn.dropout(a, 0.8) c = tflearn.lstm(b, 200) d = tflearn.dropout(c, 0.8) 其中:

sbrk(stack)

我malloc总是比我需要的更多然后我想取一些大小为void *malloc(size_t size) { stack = 0; while (stack < size) stack += 4096; } 的分配区域并返回它,如果我想在已经分配内存后再做另一个malloc所以我不需要多次打电话给sbrk。 我怎么能这样做,我试着回到sizebrk(start_of_the_allocated_space)来获得我需要的空间的开始和结束,但它是段错误的。

编辑:

sbrk(size)

这是我的结构。 然后我有一个创建块的函数

struct s_block {
size_t size;
struct s_block *next;
struct s_block *prev;
void *start;
void *end;
}

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,那么你似乎想要做一个大的sbrk(),然后每次你在malloc时拆分一个新的。

这个想法很好,因为你的程序负载sbrk,但似乎你误解了一些属于malloc的东西。

Malloc在其最简单的实现中分配了一定量的空间,如下所示:

struct metadata
{
   size_t size;
   int free;
   struct metadata *next;
   void *data; 
}

数据是指向分配区域的第二部分的指针,包含实际空间。 next是指向已分配区域末尾的指针。

malloc某个空格时,您创建此结构并返回数据指针。 然后,为了解放你只需要返回设置&#34; free&#34;值为1.

这会生成一个链接列表,其中包含您的所有数据,以及您的sbrk&amp; d区域中的所有数据。

有关不同malloc实现的更多信息,请参阅this answer 它使用mmap但也可以使用sbrk