- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的程序将频繁地将数据包写入磁盘( 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/
我正在编写一个插件,有一个ajax调用向用户显示数据。 如果用户想在ajax成功时添加一些js?他可以从他的 js 脚本中做到这一点吗,比如定位这个 ajax 成功事件。 例如: $(documen
我有 html 代码,例如 - x 最初插入 div 'insert_calendar_eda_form'。 Javascript代码 calendar_eda_add
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我已经使用命令 sudo start myservice 启动了一个 upstart 服务。我想要一种方法,以便稍后我(或任何人)可以检查该服务是否已启动并正在运行。检查它的命令是什么? 最佳答案 找
我是一名优秀的程序员,十分优秀!