3

我正在编写软件来模拟“first-fit”内存分配模式。

基本上,我分配了一大块 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'

我明白为什么这是无效的..但是我怎样才能将我的节点放入我新分配的内存的指针位置?

4

4 回答 4

2
memset(void* memory, int value, size_t size)

所以,它不是复制head_nodehead_ptr(你正在考虑memcpy),它是用于初始化内存(清除为 0,标记为释放,等等......)。

在这种情况下,您可以简单地将head_ptra 转换为node*

node* head_node = (node*)head_ptr;

现在您根本不必delete head_node复制或复制这些值head_ptr

于 2010-03-31T00:34:52.097 回答
1

阅读文档。 memset将 int (但解释为 a unsigned char)作为第二个参数。这指定了将内存区域的第一个n字节设置为的值,其中n是第三个参数。

您可以使用memcpy,它将一个内存区域复制到另一个区域。尝试:

memcpy(head_ptr, head_node, sizeof(node));

编辑:另一种选择是使用 head_ptr 的指针转换来设置上一个和下一个值,正如西蒙所建议的那样。

于 2010-03-31T00:31:30.567 回答
1

如果我正确理解您的问题,您希望将节点对象构造到分配并由 head_ptr 指向的内存中。如果您需要调用节点构造函数,您可以通过placement new运算符执行此操作,如下所示:

node* head_node = new(head_ptr) node;

如果您确实需要确保也调用了析构函数,那么您必须手动调用 delete:

head_node->~node();
于 2010-03-31T00:38:15.590 回答
0

你不能像那样分配指针。第二个论点int要重复。

来自memset(3)

概要
     #include <string.h>

     空白 *
     memset(void *b, int c, size_t len);

描述
     memset() 函数写入值 c 的 len 个字节(转换为
     一个无符号字符)到字节串 b。

返回值
     memset() 函数返回它的第一个参数。
于 2010-03-31T00:33:15.423 回答