我目前有一个结构
typedef struct Entry {
int counter;
void *block;
} Entry;
和mmap的内存块
void *memPtr = mmap(NULL, someSize*1024, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
然后我将条目一直添加到第一部分(这是愚蠢的,但那部分有点无关紧要),如下:
int AddEntry(void *data) {
Entry entry;
entry.counter = 1;
entry.block = malloc(sizeof(char *) * SECTOR_SIZE);
memcpy(entry.block, data, SECTOR_SIZE);
memcpy(&memPtr[0], &entry, sizeof(Entry));
return 0;
}
这里的问题是Entry
只有16个字节,因为block
是void pointer
。什么是确保该块实际上是sizeof(char *)* SECTOR_SIZE的大小并且实际上有足够的空间用于数据的最佳方法,以及如何将data
加载到entry.block
?
谢谢!
答案 0 :(得分:5)
如果我正确地阅读了这个问题,你就会问如何获得一个可以用(较小的)Entry *
最常见的方法是定义您的结构,如:
typedef struct Entry {
int counter;
unsigned char block[1];
}
根据编译器的行为,您还可以将块定义为零长度数组。
然后,您可以malloc结构和SECTOR_SIZE所需的空间:
int AddEntry(void *data) {
Entry *entry;
entry = malloc(sizeof(Entry) + ((SECTOR_SIZE-1) * sizeof(unsigned char));
// obligitory NULL checks assumed here
// fill in structure
entry->counter = 1;
memcpy(entry->block, data, SECTOR_SIZE);
memcpy(&memPtr[0], &entry, sizeof(Entry) + ((SECTOR_SIZE-1) * sizeof(unsigned char));
return 0;
}
这也允许您通过以下方式访问block
的第78个字节:
entry->block[77]