C中结构的数组

时间:2009-09-08 17:59:34

标签: c++ memory-management

我正在努力理解这个概念:我有一个固定的大小定义:

(来自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->区域中放置/覆盖?我该怎么做?

谢谢, 马塞洛

4 个答案:

答案 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