gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:21 26 4
gpt4 key购买 nike

我目前有一个结构

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

和一个映射的内存块

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。确保该 block 实际上是 sizeof(char *) * SECTOR_SIZE 的大小并且实际上有足够的数据空间的最佳方法是什么,以及如何将 data 加载到 entry.block?

谢谢!

最佳答案

如果我没看错问题,你是在问如何获得可以使用(较小的)Entry *

访问的连续内存块

最常见的方法是像这样定义结构:

typedef struct Entry {
int counter;
unsigned char block[1];
}

根据编译器的行为,您还可以将 block 定义为零长度数组。

然后您可以 malloc 结构和 SECTOR_SIZE 所需的空间:

int AddEntry(void *data) {
Entry *entry;
entry = malloc(sizeof(Entry) + ((SECTOR_SIZE-1) * sizeof(unsigned char));
// obligitory NULL checks assumed here<p></p>

<p>// 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;
}
</p>

这还允许您通过以下方式访问 block 的第 78 个字节:entry->block[77]

关于c - 结构中的 Void * 空间而不是 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9457661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com