c-结构中的Void*空间,而不是malloc



我目前有一个结构

typedef struct Entry {
    int counter;
    void *block;
} Entry;

和存储器的mmap’ed块

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字节长,因为blockvoid pointer。确保块实际大小为sizeof(char*)*SECTOR_size并且实际有足够的数据空间的最佳方法是什么?如何将data加载到entry.block中?

谢谢!

如果我读对了这个问题,你会问如何获得一个可以用(较小的)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]

相关内容

  • 没有找到相关文章

最新更新