C++ C中结构内部的数组

C++ C中结构内部的数组,c++,memory-management,C++,Memory Management,我很难理解这个概念:我有一个固定大小的定义: (来自) 此FlashRegion结构在另一个结构中使用: (发件人:) 问题是,我可以在FlashInfoEx中拥有数量可变的FlashRegions。我正在调试的函数在代码中的某个地方执行以下操作: memcpy (pFlashInfoEx->region, g_pStorageDesc->pRegionTable, g_pStorageDesc->dwNumRegions * sizeof(FlashR

我很难理解这个概念:我有一个固定大小的定义:

(来自)

此FlashRegion结构在另一个结构中使用: (发件人:)

问题是,我可以在FlashInfoEx中拥有数量可变的FlashRegions。我正在调试的函数在代码中的某个地方执行以下操作:

 memcpy (pFlashInfoEx->region,  g_pStorageDesc->pRegionTable,
         g_pStorageDesc->dwNumRegions *  sizeof(FlashRegion));
这意味着它将大量区域复制到pFlashInfoEx(我在函数调用中传递)

因此,如果dwNumRegions大于1,代码将覆盖内存。如果是这样的话,我应该在代码中创建一个FlashRegion[FIXED_SIZE],然后在FlashInfoEx->region中放置/覆盖它吗?我该怎么做

谢谢,
Marcelo的概念是,虽然FlashRegion看起来像一个固定大小的结构,但实际上它是动态大小的。当分配结构时,这种神奇的功能就完成了——不是调用
(FlashRegion*)malloc(sizeof(FlashInfoEx))
新FlashRegion
,而是调用
(FlashRegion*)malloc(sizeof(FlashInfoEx)+sizeof(FlashRegion)*(numRegions-1))

对于大小不同的结构,这是一种相当常见的C习惯用法。为了实现这一点,您需要确保为所需的数组大小分配足够的内存,通常类似于

pFlashInfoEx = malloc(offsetof(PFlashInfoEx, region) + g_pStorageDesc->dwNumRegions *  sizeof(FlashRegion));
<>这与在C++中使用“新”的情况很不协调;您必须手动分配内存:

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;
void*mem=::新操作符(offsetof(PFlashInfoEx,region)+g_pStorageDesc->dwNumRegions*sizeof(FlashRegion));
pFlashInfoEx=新(mem)pFlashInfoEx;
对于(inti=1;idwNumRegions;i++)
新建(&pFlashInfoEx->region[i])FlashRegion;

您正在使用的interace正在使用struct hack。这意味着您需要为该结构手动动态分配足够的存储空间,就好像它是用region声明的,region是一个包含多个
FlashRegion
的数组一样

对于这个接口,它需要有足够的空间来容纳至少一组
dwnumregion
FlashRegion
s


类似于
offsetof(FlashInfoEx,region)+sizeof FlashRegion*n
字节,其中
n
是一个数字,您需要随后传递到
FMD\u GetInfoEx
或任何您正在使用的函数。

请参见前面问题中的一个简单示例。

哇,你们在这里速度很快!因此,这意味着区域应该始终是结构的最后一个成员,对吗?根据编译器的不同,这不是一个风险吗?当定义结构以便能够与任何API交互时,您需要能够定义结构的精确内存布局。我认为标准要求结构成员按照指定的顺序排序,但它没有指定对齐方式。实际上,所有编译器都提供对齐控制。是的,区域必须是最后一个。风险?只有在C本身有风险的情况下。事实上,这就是该语言的用意。有一个原因,现代语言使这不可能,但这并不能追溯到从C89和C90工具包中撕开设计模式。在C++中,是非常危险的。它对非POD类型、复制构造函数等都不起作用。但在C语言中,这是一个相当常见的技巧。
pFlashInfoEx = malloc(offsetof(PFlashInfoEx, region) + g_pStorageDesc->dwNumRegions *  sizeof(FlashRegion));
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;