【问题标题】:How to initialize and manipulate an address pointer如何初始化和操作地址指针
【发布时间】:2017-01-30 11:29:41
【问题描述】:

我试图在不使用 malloc 的情况下将一个堆空间块初始化为几个较小的固定大小块。每个块指向下一个块。基本上,它是一个自制的链表,不使用 malloc。结构如下:

/******** Memory Table Entry Data Structure**********/
typedef struct
{
    ????? block_address;  //<- What datatype should I use here?
    void* next_free_block;

}mem_table_entry_t;

/******** Memory Table Data Structure**********/
typedef struct
{
    mem_table_entry_t two_kib[8];

}mem_table_t; 

链接器通过外部变量 _sys_memory 使堆的起始地址可供程序使用,如下所示:

extern void* _sys_memory;   // Start of system memory

在我的初始化例程中,我想创建一个指针并让它指向与_sys_mem 相同的地址。稍后,我想将指针增加 2048 并将该值分配给下一个块的起始地址。我应该使用哪种数据类型以及如何操作它?

#include <stdint.h>
#include "mem_manager.h"

mem_table_t memory_table;

void mem_initialize(void)
{
    int block_count = 0;

    void *dynamic_address;

    dynamic_address = _sys_memory;

    while(block_count < 8)
    {

        memory_table.two_kib[block_count].block_address = dynamic_address;
        dynamic_address = (&dynamic_address + 0x800);

        memory_table.two_kib[block_count].next_free_block = dynamic_address;
        block_count++;
    }

【问题讨论】:

  • 请告诉我这样做的动机是什么
  • @EdHeal - 这是大学课程的一部分。我们需要创建自己的 malloc() 和 free() 函数。我们使用的特定硬件有 80kiB 的堆空间,可以分割成各种固定大小。我的设计的实现很少顺利....lol
  • 这门课看起来很有趣,我的意思是实现你自己的 malloc() ,我真的很想看到你完成它! @达雷尔
  • Malloc 是一项棘手的工作。您真的要建立一个表来分配 8 个 2Kb 块吗?使用基本指针算法(dynamic_address = _sys_memory + 0x800 * chunkNumber)似乎更容易完成并完全跳过表格。
  • block_address 的类型应该是 void *char *char * 的优点是您可以在其上进行地址运算,而在不依赖 GCC 中的编译器扩展(以及 Clang 以实现 GCC 兼容性)的情况下,您无法在 void * 上进行地址运算。

标签: c pointers memory-address dereference pointer-arithmetic


【解决方案1】:

您的想法有些模棱两可(您没有详细说明实现 malloc 的想法)。反正你写错了

dynamic_address=(&dynamic_address+0x800)

因为它应该是:

dynamic_address = dynamic_address + 0x800

【讨论】:

  • 是的,我也这么认为。当我进行您建议的更改时,出现编译错误:“表达式必须是指向完整对象类型的指针。”想法?
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 2011-10-31
  • 1970-01-01
  • 2010-12-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多