Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构中的Void*空格,而不是malloc_C_Malloc_C99 - Fatal编程技术网

结构中的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; }