如何将 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
我想 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