【发布时间】:2012-03-16 14:39:10
【问题描述】:
我尝试使用更广为接受的习语将结构的 void* 成员替换为灵活的数组成员:
typedef struct Entry {
int counter;
//void* block2; // This used to be what I had
unsigned char block[1];
}
然后我将条目添加到一个连续的内存块中:
void *memPtr = mmap(NULL, someSize*1024, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
这样:
int number = 0;
int AddEntry(void *data) {
Entry *entry;
entry = malloc(sizeof(Entry) + ((SECTOR_SIZE-1) * sizeof(unsigned char));
entry->counter = 1;
memcpy(entry->block, data, SECTOR_SIZE);
// make sure number doesn't overflow space, etc...
memcpy(&memPtr[number], entry, sizeof(Entry) + ((SECTOR_SIZE-1) * sizeof(unsigned char));
number++;
return 0;
}
问题是在我需要时解压这些数据。例如,如果我这样做:
void * returnBlock(int i) {
Entry * entry = &memPtr[i];
printf("Entry counter is %d\n", entry->counter); // returns 1, reliably
return entry->block; // Gives me gibberish but not if I uncomment void* block2.
}
这可能是有原因的吗?我不一定认为我在任何地方都踩着东西,它曾经与 void* 方法一起使用。 奇怪的是,如果我将一个虚拟 void* 放回结构中,它就可以工作。如果我放入一个虚拟 int 它将不起作用。
编辑:实际上,如果AddEntry 中的number 不为0,它也会失败。如果有的话,我在踩什么?
【问题讨论】:
-
您不能创建包含灵活数组成员的结构数组。
-
memptr[i]到底是什么?您不能为void指针下标。 -
正如@R.. 所说,拥有一个灵活数组的数组是没有意义的。灵活数组成员的所有想法是您拥有数据结构的“标题”部分并且数组本身是连续的。因此,如果您真的需要不同大小的
Entrys,则需要一个指向该类型的指针数组。
标签: c malloc c99 flexible-array-member