如何将uint8*强制转换为包含可变长度数组元素的结构?(C)方案编制
我想解析/转换我有一个如何将uint8*强制转换为包含可变长度数组元素的结构?(C)方案编制,c,arrays,memory,dynamic,runtime,C,Arrays,Memory,Dynamic,Runtime,我想解析/转换我有一个uint8*pMyMemoryLocation要转换的数据。数据在内存中表示为uint8,但应转换/解析为已知组成的结构 应将数据解析为: typedef struct{ uint8 iNrOfChannels; uint8 someValue1; uint16 someValue2; uint32 someValue3; struct{ uint8 someMoreValue1; uint16 someMoreValue2; uint32 some
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]:表达式必须具有常量值
现在,inrofChannel
只能在运行时获得,因为它是pMyFirstStruct
的第一个成员
我不想复制或使用更多的内存,因为数据以正确的顺序位于*pMyMemoryLocation
,并且我确实掌握了有关其组成的信息
是否有可能使用动态大小强制转换该结构数组
提前谢谢你的帮助
编辑:我对C编程非常陌生…对于
myFirstStructType*pMyFirstStruct=(myStructType*)pMyMemoryLocation代码>
假设数据在pMyMemoryLocation
中可用
大多数结构都会有一些填充字节。您必须处理这些填充字节,因此,对于myFirstStructType*pMyFirstStruct=(myStructType*)pMyMemoryLocation,您生成的任何代码都将依赖于实现代码>
假设数据在pMyMemoryLocation
中可用
大多数结构都会有一些填充字节。您必须处理这些填充字节,因此所生成的任何代码都将依赖于实现您的问题是无法将某些内容强制转换到动态数组中。
一旦结构正确初始化,内存将如下所示:
|1字节| 1字节| 2字节| 4字节| 8字节|-->| inrof通道*大小(mySecondStructType)字节|
您的前4个变量相邻,然后是指针。
它的大小始终为8字节,因为它是指针,指针大小从不变化。但该指针指向内存中的一个随机位置,该位置的大小足以包含mySecondStruct数组。
您需要为该指针分配内存,否则您将永远没有足够的内存
pMyFirstStruct->inner_struct = malloc (sizeof (mySecondStructType) * pMyFirstStruct->iNrOfChannels);
这样,你就有了两个内存区域,一个是由1,1,2,4,8字节组成的结构,另一个是由指针指向内存中某个动态大小的区域
现在,您只需创建一个循环,将内存逐通道转换为SecondStructType
我希望我已经足够清楚了^=^解释内存使用/指针从来都不容易:3您的问题是无法将某些内容强制转换到动态数组中。
一旦结构正确初始化,内存将如下所示:
|1字节| 1字节| 2字节| 4字节| 8字节|-->| inrof通道*大小(mySecondStructType)字节|
您的前4个变量相邻,然后是指针。
它的大小始终为8字节,因为它是指针,指针大小从不变化。但该指针指向内存中的一个随机位置,该位置的大小足以包含mySecondStruct数组。
您需要为该指针分配内存,否则您将永远没有足够的内存
pMyFirstStruct->inner_struct = malloc (sizeof (mySecondStructType) * pMyFirstStruct->iNrOfChannels);
这样,你就有了两个内存区域,一个是由1,1,2,4,8字节组成的结构,另一个是由指针指向内存中某个动态大小的区域
现在,您只需创建一个循环,将内存逐通道转换为SecondStructType
我希望我足够清楚^=^解释内存使用/指针从来都不容易:3注意:即使是第一个也有未定义的行为嘿!是的,我知道。。。我想这有点像黑客。。。我在另一篇文章中读到了这一点。然而,我需要一种方法以某种方式将内存强制转换为我希望数据一致的类型。没有任何编译器可以保证它工作,x86-64 GCC包括注意:即使是第一个编译器也有未定义的行为嘿!是的,我知道。。。我想这有点像黑客。。。我在另一篇文章中读到了这一点。然而,我需要一种方法以某种方式将内存强制转换为我希望数据一致的类型。没有编译器可以保证它正常工作,x86-64 GCC includeOK我想我明白了。然而,我知道,在本例中,数据位于该位置并按顺序排列。我在一个嵌入式系统上,数据位于一个缓冲区中,需要解析。有没有可能以某种方式用类型信息“覆盖”已经存在的内存中的数据?数据是这样的:| 1字节| 1字节| 2字节| 4字节| iNrOfChannels*(| 1字节| 2字节| 4字节|)|事情是这样的,即使数据的顺序正确(对于静态分配的数组,情况就是这样)如果在编译时不知道通道的数量,就不能跳过分配新内存的部分。因为结构大小永远不会改变。因此,您必须使用指针。虽然我想知道是否没有一种方法可以一次强制转换整个数组,但一旦完成malloc,我想这是可能的,尽管我一直在使用p请尽可能多地参考拆分我的代码,以便最终发布process@sunchezz如果在编译时知道inrof通道,那是真的,但事实并非如此。OP将其放置在那里,以便我们知道他想要使用的变量,我猜不是真实的代码。这不能由design静态分配。我使用了您的解决方案并使其工作。我必须正如你所说的,分配内存,但现在它正在按预期工作。谢谢!好的,我想我明白了。但是我知道数据位于该位置,在这种情况下按顺序排列。我在一个嵌入式系统上,数据位于一个要解析的缓冲区中。是否有可能以某种方式“覆盖”已经存在的m