gpt4 book ai didi

c - 将结构类型转换为字节数组,以便稍后调用 fwrite

转载 作者:行者123 更新时间:2023-11-30 17:40:19 25 4
gpt4 key购买 nike

我的程序将频繁地将数据包写入磁盘( fwrite() ),并通过以太网将它们发送出去( send() )。数据包的组织结构如下:

        struct PacketStruct{

uint32_t Type;
uint8_t * DataPtr;
uint32_t Length;

};

内存是动态分配的,指针分配给PacketStruct.DataPtr。

我的问题是,假设我想使用另一个结构来组织 DataPtr 最终指向的数据。例如:

        struct MyStruct{
uint32_t A;
uint8_t B;
uint32_t C;
};

然后:

        NewPacket = malloc( sizeof(struct PacketStruct) );
NewStruct = malloc( sizeof(struct MyStruct) );
NewStruct->A = 1;
NewStruct->B = 2;
NewStruct->C = 3;

如果我这样做:

        NewPacket->DataPtr = (uint8_t *) NewStruct;
NewPacket->Length = sizeof( struct MyStruct);

当我这样做时,我会遇到结构填充等问题吗:

        fwrite( (void *) NewPacket->DataPtr, 1, (size_t) NewPacket->Length, fout); 

最佳答案

这取决于你所说的“问题”是什么意思。以下是我发现的潜在陷阱:

1) struct MyStruct 可以在任何成员之后包含填充(并且可能在 B 之后)。此填充覆盖的内存不会由 malloc 或赋值语句初始化。如果您使用calloc,这些区域将被初始化为0。

2) 如果您需要从文件中读回结构,它将在相同的实现中工作(成员的对齐方式是实现定义的)。但是一旦你改变了架构、编译器,甚至可能是编译器选项,你就不会再读回你写的内容。

3) 使用强制转换可防止编译器执行任何可能捕获错误的类型检查。如果您可以控制 struct PacketStruct 的定义,请考虑使用 DataPtr 可能类型的union。这允许您准确指定所需的类型,当您只关心字节时将数据视为 uint8_t ,而当您将其视为一个时将数据视为 struct MyStruct 。 p>

4)更多的是挑剔,但是:不需要调用 fwrite 中的强制转换,并且理论上如果这些字段的定义稍后发生更改,可以隐藏错误。

关于c - 将结构类型转换为字节数组,以便稍后调用 fwrite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21562833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com