我是新编码,在复制结构元素的浮点值并传入int transmit_buffer[12]
时面临问题。
请帮忙。
#include <stdio.h>
#include <string.h>
int i;
main(){
int transmit_buffer[12];
struct TX_REPORT{
int variable1;
float variable2;
int variable3;
int variable4;
int variable5;
int variable6;
};
struct TX_REPORT transmit_report = {1, 1.5, 40, 1, 45, 7};
memcpy(transmit_buffer, &transmit_report, sizeof transmit_buffer);
for(i=0;i<6;i++){
printf("%d\n",transmit_buffer[i]);
}
}
答案 0 :(得分:2)
您的代码不是标准C,并展示了一些undefined behavior。
无法保证sizeof(float) == sizeof(int)
。无法保证浮点数具有IEEE 754表示。
但是,在x86 / Linux上,两种假设都是正确的。
顺便说一句,如果您想将这样的结构发送到文件或通过网络,请考虑一些serialization技术。我建议使用JSON
等文本序列化格式答案 1 :(得分:1)
你必须要问的是复制结构成员而不是结构。 因为你用不同的类型变量写的是不可能的,这可以用memcpy();
来完成char *buf = malloc(sizeof(info.a) + sizeof(info.b) + sizeof(info.c));
// Get a pointer to the beginning of the buffer
char *p = buf;
// Copy sizeof(info.a) bytes of stuff from info.a to p
memcpy(p, info.a, sizeof(info.a));
// Advance p to point immediately after the copy of info.a
p += sizeof(info.a);
// And so on...
memcpy(p, info.b, sizeof(info.b));
p += sizeof(info.b);
memcpy(p, info.c, sizeof(info.c));
答案 2 :(得分:0)
您的代码看起来或多或少都没问题,并且您没有说明您面临的实际问题,但我猜您对浮动元素显示为不具有的int值这一事实感到不满意显然符合其原始价值。这实际上只是一个整容问题(因为你对printf这个元素的类型撒谎),但如果你想看到一个更有意义的缓冲版本,那么你可以改变你的代码:
#include <stdio.h>
#include <string.h>
int main(){
int i;
int transmit_buffer[12];
struct TX_REPORT{
int variable1;
float variable2;
int variable3;
int variable4;
int variable5;
int variable6;
};
struct TX_REPORT transmit_report = {1, 1.5, 40, 1, 45, 7};
memcpy(transmit_buffer, &transmit_report, sizeof transmit_buffer);
for(i=0;i<6;i++){
if (i == 1) // handle float element as special case
printf("%g\n",transmit_buffer[i]);
else // other elements are ints
printf("%d\n",transmit_buffer[i]);
}
}
答案 3 :(得分:0)
你最好的选择可能是工会 -
typedef struct {
int variable1;
float variable2;
int variable3;
int variable4;
int variable5;
int variable6;
} t_AsStruct;
typedef union {
t_AsStruct as_struct;
int as_ints[sizeof(t_AsStruct)/sizeof(int) + 1]; /* N.B. a float can be various sizes so since we can't have 0.5 ints in an array add one */
} t_tx_report;
N.B。如果您可以控制结构,通常最好不要在结构中间混合使用不同大小的类型,因为这可能会因填充而导致更大的内存使用,或者由于内存对齐问题导致性能降低。