要重新编码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。
我怎么能这样做,我试着回到size
,brk(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;
}
答案 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