我正在努力理解这个概念:我有一个固定的大小定义:
(来自http://msdn.microsoft.com/pt-br/library/aa931918.aspx)
typedef struct _FlashRegion {
REGION_TYPE regionType;
DWORD dwStartPhysBlock;
DWORD dwNumPhysBlocks;
DWORD dwNumLogicalBlocks;
DWORD dwSectorsPerBlock;
DWORD dwBytesPerBlock;
DWORD dwCompactBlocks;
} FlashRegion, *PFlashRegion;
这个FlashRegion结构用于另一个结构: (来自:http://msdn.microsoft.com/pt-br/library/aa932688.aspx)
typedef struct _FlashInfoEx {
DWORD cbSize;
FLASH_TYPEflashType;
DWORD dwNumBlocks;
WORD dwDataBytesPerSector;
DWORD dwNumRegions;
FlashRegion region[1];
} FlashInfoEx, *PFlashInfoEx;
问题是,我可以在FlashInfoEx中拥有可变数量的FlashRegions。我调试的函数在代码中的某处执行:
memcpy (pFlashInfoEx->region, g_pStorageDesc->pRegionTable,
g_pStorageDesc->dwNumRegions * sizeof(FlashRegion));
这意味着它将一定数量的区域复制到pFlashInfoEx(我在函数的调用中传递);
因此,如果dwNumRegions大于1,代码将覆盖内存。如果是这种情况,我应该在我的代码中创建一个FlashRegion [FIXED_SIZE]并以某种方式在FlashInfoEx->区域中放置/覆盖?我该怎么做?
谢谢, 马塞洛
答案 0 :(得分:6)
这个概念是FlashRegion看起来像一个固定大小的结构,它实际上是动态大小的。在分配结构时完成了魔术 - 而不是调用(FlashRegion*)malloc(sizeof(FlashInfoEx))
或new FlashRegion
,而是调用类似(FlashRegion*)malloc(sizeof(FlashInfoEx)+sizeof(FlashRegion)*(numRegions-1))
答案 1 :(得分:2)
对于可变大小的结构,这是一种相当常见的C语言。为了使这项工作,您需要确保为所需的数组大小分配足够的内存,通常类似于
pFlashInfoEx = malloc(offsetof(PFlashInfoEx, region) + g_pStorageDesc->dwNumRegions * sizeof(FlashRegion));
这与尝试在C ++中使用'new'非常相互影响;你必须手动分配内存:
void *mem = ::operator new(offsetof(PFlashInfoEx, region) + g_pStorageDesc->dwNumRegions * sizeof(FlashRegion));
pFlashInfoEx = new(mem) PFlashInfoEx;
for (int i = 1; i < g_pStorageDesc->dwNumRegions; i++)
new (&pFlashInfoEx->region[i]) FlashRegion;
答案 2 :(得分:1)
您正在使用的interace正在使用 struct hack 。这意味着您需要手动为结构动态分配足够的存储空间,就像声明的区域是一个多于1 FlashRegion
的数组一样。
对于此界面,它至少需要足够的空间和dwNumRegions
FlashRegion
的数组。
offsetof(FlashInfoEx, region) + sizeof FlashRegion * n
字节之类的内容n
是您需要随后传递给FMD_GetInfoEx
或您正在使用的任何函数的数字。
答案 3 :(得分:0)
...使用上一个问题中的一个简单示例查看this answer on legacy design patterns。