我正在编写软件来模拟“首先适合”的内存分配架构。
基本上,我会根据模式分配一个大的X兆字节内存并将其细分为块。
我正在使用一个名为“node”的链表作为每个内存块的标题(这样我们就可以找到下一个块,而无需繁琐地遍历每个地址值。
head_ptr = (char*) malloc(total_size + sizeof(node));
if(head_ptr == NULL) return -1; // Malloc Error .. :-(
node* head_node = new node; // Build block header
head_node->next = NULL;
head_node->previous = NULL;
// Header points to next block (which doesn't exist yet)
memset(head_ptr,head_node, sizeof(node));
`
但最后一行返回:
error: invalid conversion from 'node*' to 'int'
我理解为什么这是无效的..但是如何将我的节点放入我新分配的内存的指针位置?
答案 0 :(得分:2)
memset(void* memory, int value, size_t size)
所以,不要将head_node
复制到head_ptr
(您正在考虑memcpy
),
它用于初始化内存(清除为0,标记为已释放等等)。
在这种情况下,您只需将head_ptr
转换为node*
:
node* head_node = (node*)head_ptr;
现在您不必delete head_node
,或将值复制到head_ptr
。
答案 1 :(得分:1)
阅读文档。 memset
将int(但解释为unsigned char
)作为第二个参数。这指定了设置第一个n
字节的值,其中n
是内存区域的第三个参数。
您可以使用memcpy
,它会将一个内存区域复制到另一个区域。尝试:
memcpy(head_ptr, head_node, sizeof(node));
编辑:另一种方法是使用head_ptr的指针转换来设置上一个和下一个值,如Simon所建议。
答案 2 :(得分:1)
如果我理解你的问题,你想要将你的节点对象构建到head_ptr分配和指向的内存中。如果需要调用节点构造函数,可以通过placement new运算符执行此操作,如下所示:
node* head_node = new(head_ptr) node;
如果你确实需要确保也调用了析构函数,那么你必须手动调用delete:
head_node->~node();
答案 3 :(得分:0)
你不能指定那样的指针。第二个论点是重复int
。
来自memset(3)
:
SYNOPSIS #include <string.h> void * memset(void *b, int c, size_t len); DESCRIPTION The memset() function writes len bytes of value c (converted to an unsigned char) to the byte string b. RETURN VALUES The memset() function returns its first argument.