如何将 uint8 * 转换为包含可变长度数组元素的结构? (C 编程)

How can I cast uint8 * to struct that contains array element of variable length? (C Programming)

我想 parse/cast 我有 uint8 * pMyMemoryLocation 的数据。数据在内存中表示为 uint8,但应 casted/parsed 到已知组成的结构。

数据应解析为:

typedef struct{
 uint8 iNrOfChannels;
 uint8 someValue1;
 uint16 someValue2;
 uint32 someValue3;

 struct{
  uint8 someMoreValue1;
  uint16 someMoreValue2;
  uint32 someMoreValue3;
 }mySecondStructType[iNrOfChannels];

}myFirstStructType 

我有点想将内存中的 uint8 转换为这些结构,我是这样做的:

 myFirstStructType * pMyFirstStruct = (myStructType *)pMyMemoryLocation;
 pMyMemoryLocation += 8; //Set pointer 

现在可以正常工作了。问题如下:

 mySecondStructType * pMySecondStruct = 
  (mySecondStructType *[iNrOfChannels])pMyMemoryLocation;

得到我:

错误[Pe028]:表达式必须有常量值

现在 iNrOfChannels 只能在运行时获取,因为它是 pMyFirstStruct 的第一个成员!

我不想复制或使用更多内存,因为数据以正确的顺序位于 *pMyMemoryLocation,而且我确实有关于其组成的信息。

是否可以转换具有动态大小的结构数组?

提前感谢您的帮助!

编辑:我真的是 C 编程的新手...

对于myFirstStructType * pMyFirstStruct = (myStructType *)pMyMemoryLocation;

假设数据在pMyMemoryLocation,

大多数结构都会有一些填充字节。您将不得不处理这些填充字节,因此您编写的任何代码都将 实现相关

您的问题是您无法将某些内容转换为动态数组。 一旦您的结构被正确初始化,您的内存将如下所示: | 1 字节 | 1 字节 | 2 字节 | 4 字节 | 8 字节 | ------> | iNrOfChannels * sizeof (mySecondStructType) 字节|

您的前 4 个变量彼此相邻,然后是您的指针。 它的大小始终为 8 个字节,因为它是一个指针,并且指针大小永远不会改变。但是该指针指向内存中的一个随机位置,该位置的大小足以包含 mySecondStruct 数组。 您需要为该指针分配内存,否则您将永远没有足够的内存。

pMyFirstStruct->inner_struct = malloc (sizeof (mySecondStructType) * pMyFirstStruct->iNrOfChannels);

这样,你就有了 2 个内存区域,一个由 1、1、2、4、8 个字节组成,组成你的结构,然后是一个动态大小的,在你的内存中的某个地方,由你的指向指针。

您现在只需创建一个循环,将您的内存通道逐个转换为 SecondStructType。

我希望我足够清楚^=^解释内存使用/指针绝非易事:3