编辑:这是内存处理库的一部分,目的是“重新发明”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;
};
答案 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);
实现内存管理库无论如何都会涉及一些棘手的指针算法,但是通过小心用于跟踪已分配内存的类型,您至少可以最小化问题。