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

时间:2019-07-26 09:12:35

标签: c arrays memory dynamic runtime

我想解析/广播我有一个uint8 * pMyMemoryLocation的数据。数据在内存中以uint8表示,但必须强制转换/解析为已知组成的结构。

数据应解析为:

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编程的新手...

2 个答案:

答案 0 :(得分:0)

myFirstStructType * pMyFirstStruct = (myStructType *)pMyMemoryLocation;

假设数据在pMyMemoryLocation中可用,

大多数结构将具有一些填充字节。您将必须注意这些填充字节,因此您编写的任何代码都将与实现相关

答案 1 :(得分:0)

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

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

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

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

您现在只需循环即可将您的内存通道逐个转换为SecondStructType。

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