结构中的Void*空格,而不是malloc
我目前有一个结构结构中的Void*空格,而不是malloc,c,malloc,c99,C,Malloc,C99,我目前有一个结构 typedef struct Entry { int counter; void *block; } Entry; 还有一块内存 void *memPtr = mmap(NULL, someSize*1024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 然后我一直在第一部分添加条目(这很愚蠢,但那部分有点不相关),如下所示: 这里的问题是
typedef struct Entry {
int counter;
void *block;
} Entry;
还有一块内存
void *memPtr = mmap(NULL, someSize*1024, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
然后我一直在第一部分添加条目(这很愚蠢,但那部分有点不相关),如下所示:
这里的问题是条目
只有16字节长,因为块
是一个无效指针
。确保块的大小实际上等于(char*)*扇区大小并有足够的数据空间的最佳方法是什么?如何将数据加载到条目中。块
谢谢 如果我没有看错问题,那么您是在问如何获得一个连续的内存块,该内存块可以通过一个(较小的)条目来访问*
最常见的方法是定义您的结构,如:
typedef结构条目{
整数计数器;
无符号字符块[1];
}
根据编译器的行为,还可以将块定义为零长度数组
然后,可以malloc结构所需的空间和扇区大小:
整数加法(无效*数据){
条目*条目;
条目=malloc(sizeof(条目)+(扇区大小-1)*sizeof(无符号字符));
//此处假定为强制空检查
//填充结构
输入->计数器=1;
memcpy(条目->块、数据、扇区大小);
memcpy(&memPtr[0],&entry,sizeof(entry)+(扇区大小-1)*sizeof(无符号字符));
返回0;
}
这也将允许您通过以下方式访问块
的第78个字节:
entry->block[77]
如果我读对了问题,你是在问如何获得一个连续的内存块,这个内存块可以通过一个(较小的)条目来访问*
最常见的方法是定义您的结构,如:
typedef结构条目{
整数计数器;
无符号字符块[1];
}
根据编译器的行为,还可以将块定义为零长度数组
然后,可以malloc结构所需的空间和扇区大小:
整数加法(无效*数据){
条目*条目;
条目=malloc(sizeof(条目)+(扇区大小-1)*sizeof(无符号字符));
//此处假定为强制空检查
//填充结构
输入->计数器=1;
memcpy(条目->块、数据、扇区大小);
memcpy(&memPtr[0],&entry,sizeof(entry)+(扇区大小-1)*sizeof(无符号字符));
返回0;
}
这也将允许您通过以下方式访问块
的第78个字节:
entry->block[77]
这里的问题是,条目只有16字节长,因为block是一个空指针。我不明白为什么这是一个问题。你想实现什么?我基本上有足够的空间来缓存(memPtr)使用指针会使缓存的前提无效,因为我在缓存之外分配了更多的空间。例如,如果扇区大小为256,我希望条目的大小为4+256。这里的问题是条目只有16字节长,因为块是一个空指针,我不明白为什么会有问题。你想实现什么?我是essentia如果为缓存(memPtr)提供足够的空间并使用指针,则缓存的前提将无效,因为我正在缓存外部分配更多空间。例如,如果扇区大小为256,我希望条目的大小为4+256。您也可以使用灵活的数组:unsigned char block[]
我想没有办法在堆栈上创建它?@Andrew为什么会有扇区\u SIZE-1?@Rio“扇区\u SIZE-1”是因为sizeof(条目)在定义中已经包含了一个数组字节。您也可以使用灵活的数组:无符号字符块[]
我想没有办法在堆栈上创建它?@Andrew为什么会有扇区大小-1?@Rio“扇区大小-1”是因为sizeof(条目)在定义中已经包含了数组的一个字节。
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;
}
typedef struct Entry {
int counter;
unsigned char block[1];
}
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;
}