【问题标题】:Cannot convert a pointer to a struct to a int pointer无法将指向结构的指针转换为 int 指针
【发布时间】:2020-10-21 09:43:57
【问题描述】:

我正在尝试为我的操作系统构建内存管理器。但是,当我添加指向第一个堆项的下一个节点属性的指针时,它不起作用。我怀疑它无法将指向堆项的指针转换为无符号整数指针。

常量

#define MEMORY_BLOCK_FREE 0
#define MEMORY_BLOCK_USED 1
#define MEMORY_BLOCK_TAIL 2

内存块结构

typedef struct
{
    u32* addr;
    u32 size;
    u8 state;
    u32* next_block;
} memory_block;

添加功能

u32* add_block(u32 size)
{
    memory_block* cblock = &head;
    while (1)
    {
        if (cblock->state == MEMORY_BLOCK_TAIL)
        {
            break;
        }
        cblock = (memory_block*)cblock->next_block;
    }
    u32* addr = cblock->addr;
    cblock->size = size;
    cblock->state = MEMORY_BLOCK_USED;
    memory_block next;
    next.state = MEMORY_BLOCK_TAIL;
    next.addr = (u32*)(addr + size);
    cblock->next_block = (u32*)&next;
}

【问题讨论】:

  • addr + size 是可疑的。解释一下函数参数u32 size代表什么。大小(以字节为单位)?
  • 我想把addr + size变成一个指针。 u32 定义为unsigned int。 u32 是 32 位,即 4 个字节。
  • 让我们再试一次。 add_block(1) 是 4 字节块、1 字节块还是什么?
  • @chux-ReinstateMonica,我不明白。 addblock(x) 分配一个 x 字节的块。
  • next.addr = (u32*)(addr + size);size*4 添加到地址 - 指针添加。我不会称之为“addblock(x) 分配一个 x 字节的块。”

标签: c pointers memory-management operating-system heap-memory


【解决方案1】:

下一个内存块;

这是一个错误的代码。 试试这个

memory_block *next;
next = malloc(sizeof(memory_block));

【讨论】:

  • 编译器说“新”未声明。我一开始并没有说清楚,但我把它写成操作系统的一部分。它不包含很多您通常可以在 c 中找到的引用。
  • c编程中,使用malloc函数。
  • 不,我正在尝试为我的操作系统实现我自己的malalloc 函数。这是其中的一部分。另外,您知道如何使用@ 来回复用户名中有空格的人吗?它不适用于我的堆栈。
猜你喜欢
  • 1970-01-01
  • 2015-09-10
  • 2018-06-08
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多