Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何初始化和操作地址指针_C_Pointers_Memory Address_Dereference_Pointer Arithmetic - Fatal编程技术网

C 如何初始化和操作地址指针

C 如何初始化和操作地址指针,c,pointers,memory-address,dereference,pointer-arithmetic,C,Pointers,Memory Address,Dereference,Pointer Arithmetic,我试图在不使用malloc的情况下将堆空间块初始化为几个较小的固定大小的块。每个块都指向下一个块。基本上,它是一个自滚链表,不使用malloc。结构看起来是这样的: /******** Memory Table Entry Data Structure**********/ typedef struct { ????? block_address; //<- What datatype should I use here? void* next_free_block;

我试图在不使用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_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++;
    }
#包括
#包括“mem_manager.h”
内存表内存表;
void mem_初始化(void)
{
int block_count=0;
void*动态地址;
动态地址=\系统\内存;
while(块计数<8)
{
内存表。两个kib[块计数]。块地址=动态地址;
动态地址=(&动态地址+0x800);
内存表。两个kib[块计数]。下一个空闲块=动态地址;
block_count++;
}

您的想法有些含糊不清(您没有给出实现malloc的很多细节)。无论如何,您在编写时犯了一个错误

dynamic_address=(&dynamic_address+0x800)
原因应该是:

dynamic_address = dynamic_address + 0x800

你的想法有点模棱两可(关于实现malloc的想法,你没有给出太多细节)。无论如何,你在写的时候犯了一个错误

dynamic_address=(&dynamic_address+0x800)
原因应该是:

dynamic_address = dynamic_address + 0x800

请告诉我你的动机是什么this@EdHeal-这是大学课程的一部分。我们需要创建自己的malloc()和free()这一特定作业功能。我们使用的特定硬件有80kiB的堆空间,可以分割成各种固定大小。我设计的实现很少顺利进行……LOL这门课程看起来很有趣,我的意思是实现你自己的malloc(),我真的很想在您完成后再看一看!!@Darrelmalloc是一件棘手的事情。您真的想构建一个表来分配8个2Kb的块吗?使用基本的指针算法(
dynamic\u address=\u sys\u memory+0x800*chunkNumber
)似乎更容易做到这一点然后完全跳过该表。
block\u address
的类型应该是
void*
char*
char*
的优点是,您可以在它上面进行地址运算,而不依赖GCC中的编译器扩展,您就无法在
void*
上进行地址运算(还有与GCC兼容的叮当声)。请告诉我你的动机是什么this@EdHeal-这是大学课程的一部分。我们需要创建自己的malloc()和free()这一特定作业功能。我们使用的特定硬件有80kiB的堆空间,可以分割成各种固定大小。我设计的实现很少顺利进行……LOL这门课程看起来很有趣,我的意思是实现你自己的malloc(),我真的很想在您完成后再看一看!!@Darrelmalloc是一件棘手的事情。您真的想构建一个表来分配8个2Kb的块吗?使用基本的指针算法(
dynamic\u address=\u sys\u memory+0x800*chunkNumber
)似乎更容易做到这一点然后完全跳过该表。
block\u address
的类型应该是
void*
char*
char*
的优点是,您可以在它上面进行地址运算,而不依赖GCC中的编译器扩展,您就无法在
void*
上进行地址运算(对于GCC兼容性,还有叮当声)。是的,我也这么认为。当我做出您建议的更改时,出现了一个编译错误:“表达式必须是指向完整对象类型的指针。”想法?是的,我也这么认为。当我做出您建议的更改时,出现了一个编译错误:“表达式必须是指向完整对象类型的指针。”您有什么想法?