我有一个分配,我需要读取和写入一个内存块(预分配),为此,我需要实现两个函数:
memory_read(base,offset,size);
memory_write(base,offset,size,buffer);
到目前为止没问题,我成功实现了写作部分。问题在于memory_read。我需要它来返回一大块数据(可能是void *),然后我可以将它转换为我期待的任何外部并使用它。
仅作为一个例子。假设我已经为该内存编写了一个序列化结构。我想做这样的事情
void *variable;
variable = memory_read(pointer_to_where_it_is,offset,sizeof(some_structure);
(some_structure) variable // and use it for something
这就是memory_read的作用
void *memory_read(void *base, int offset, int size){
void *buffer;
buffer = malloc(size);
memcpy(&buffer,base+offset,size);
return buffer;
}
当然,由于缓冲区存在于函数堆栈中,我在返回时会失去对它的引用。
有关如何做的任何想法?我不允许教师修改函数参数,否则我会将&变量作为参数传递。
谢谢!
答案 0 :(得分:5)
在这一行:
memcpy(&buffer,base+offset,size);
问题是你试图将一块内存复制到一个堆栈分配变量buffer
,而不是这个变量指向的堆分配的内存块。解决方法是删除&
:
memcpy(buffer, base+offset, size);
否则您的代码就可以了。
UPDATE :不要忘记free()
返回的缓冲区,以便分配的内存不会“泄漏”:)