我如何指向正确的地方?

时间:2013-12-07 12:15:01

标签: c pointers

编辑:这是内存处理库的一部分,目的是“重新发明”malloc。

我的代码中的指针有问题。我想访问函数someFunc之外的ch->大小。 ch-> size的值应该是1048576(1Mb),而是4196464,我的猜测是我在再次投射到Chunk时没有指向正确的位置。怎么做对了?

type *someFunc() {
    unsigned int size = 1048576;
    int totsiz = size;
    char *memory = (char*) malloc(size); 
    while (totsiz) memory[--totsiz] = 0; 

    header *head = (header *) memory;

    head->data = NULL;

    head->fr = (char *) (memory+sizeof(header)+sizeof(man));

    head->fn = (man *) (memory+sizeof(header));
    head->fn->firstFN = firstFN;
    head->fn->secondFN = secondFN;

    Chunk ch = (Chunk) memory+sizeof(header)+sizeof(man);
    ch->start = memory+sizeof(header)+sizeof(man)+sizeof(chunk);
    ch->size = size;
    ch->next = NULL;
    ch->name = 1;

    printf("%u", ch->size); // Print 1048576

    return (type *)(head->fn);
}

然后我称之为:

type * imem = (type *) someFunc();

Chunk mem = (Chunk)((void *)imem-sizeof(char *));
printf("%d", mem->size); // Print 4196464

组块:

typedef struct _chunk chunk;
typedef chunk *Chunk;
struct _chunk {
  void* start;
  unsigned size;
  Chunk next;
  bool name;
};

1 个答案:

答案 0 :(得分:0)

这三个指针:

head->fr = (char *) (memory+sizeof(header)+sizeof(man));
head->fn = (man *) (memory+sizeof(header));
Chunk ch = (Chunk) memory+sizeof(header)+sizeof(man);

都指向内存中的不同位置。当函数返回(type *)(head->fn),然后调用代码从中减去sizeof(char *)(我不知道为什么)时,mem值指向某个位置,与您设置的位置完全不同函数内部ch

这里的所有指针算法都很难跟踪正在发生的事情。我的建议是放弃尝试在memory数组中进行自己的内存管理,而是按照上帝和丹尼斯的意图,以malloc的方式为每个对象分配自己的存储空间。

编辑:知道这是重新实现malloc的练习,这更容易理解。我仍然不确定所有的指针算法是否有意义,并且可能会建议您将memory缓冲区转换为单个指针,该指针封装了所有的头字段,如:

struct _MemoryPiece {
    header mp_head;
    man mp_man;
    chunk ch;
}
typedef struct _MemoryPiece MemoryPiece;

type *someFunc() {
    MemoryPiece *mp = (MemoryPiece *) malloc(size);
    mp->mp_head.data = NULL;
    mp->ch.size = size;
    ...
    return mp;
}

MemoryPiece *mem = (MemoryPiece *) someFunc();
printf("%d", mem->ch.size);

实现内存管理库无论如何都会涉及一些棘手的指针算法,但是通过小心用于跟踪已分配内存的类型,您至少可以最小化问题。