将结构复制到数组中

时间:2013-09-07 10:23:07

标签: c arrays structure

我是新编码,在复制结构元素的浮点值并传入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]);
   }
}

4 个答案:

答案 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。如果您可以控制结构,通常最好不要在结构中间混合使用不同大小的类型,因为这可能会因填充而导致更大的内存使用,或者由于内存对齐问题导致性能降低。