C-将两个结构附加到单个缓冲区

C-将两个结构附加到单个缓冲区,c,pointers,struct,buffer,memcpy,C,Pointers,Struct,Buffer,Memcpy,我需要这样做,两个结构的内容将在一个缓冲区内,大小与两个结构相同。我需要使用memcpy来做到这一点 这是我当前的代码: struct Header header; struct Data_Format DF; char *buffer[28]; header.Start = 0x7E; header.Options = 0x00; DF.Address = 0x007CB; DF.Result = 0x105BA; memcpy(buffer,&header,sizeof(he

我需要这样做,两个结构的内容将在一个缓冲区内,大小与两个结构相同。我需要使用memcpy来做到这一点

这是我当前的代码:

struct Header header;
struct Data_Format DF;

char *buffer[28];

header.Start = 0x7E;
header.Options = 0x00;

DF.Address = 0x007CB;
DF.Result = 0x105BA;

memcpy(buffer,&header,sizeof(header));
如何使DF结构在标题完成的地方继续?

尝试以下操作:

char buffer[sizeof(header)+sizeof(DF)];
...
memcpy(buffer,&header,sizeof(header));
memcpy(buffer+sizeof(header),&DF,sizeof(DF));
试试这个:

char buffer[sizeof(header)+sizeof(DF)];
...
memcpy(buffer,&header,sizeof(header));
memcpy(buffer+sizeof(header),&DF,sizeof(DF));

替代答案避免指针算法:

typedef struct data {
    struct Header header;
    struct Data_Format DF;
} data_t;

data_t buffer;

...

memcpy (&buffer.header, header, sizeof(Header));
memcpy (&buffer.DF, DF, sizeof(Data_Format));
当然,您可以使用外部结构的
struct
组件,并完全避免
memcpy


您可能希望将
\uuu属性\uuu(打包)
添加到
结构
,以确保填充不会占用任何空间。

替代答案避免指针算法:

typedef struct data {
    struct Header header;
    struct Data_Format DF;
} data_t;

data_t buffer;

...

memcpy (&buffer.header, header, sizeof(Header));
memcpy (&buffer.DF, DF, sizeof(Data_Format));
当然,您可以使用外部结构的
struct
组件,并完全避免
memcpy


您可能需要将
\uuu属性\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

memcpy(buffer + sizeof(header),&DF,sizeof(DF));
还要注意@Joachim Pileborg提到的一点
因为您可能不需要指针数组。

只需添加另一个memcpy即可

memcpy(buffer + sizeof(header),&DF,sizeof(DF));
还要注意@Joachim Pileborg提到的一点

因为您可能不需要指针数组。

使用指针算法和
sizeof
运算符?还要注意,您声明
buffer
是一个包含28个字符指针的数组,可能不是您想要的。@JoachimPileborg那么它应该只是“char buffer[28]”要成为一个28字节的缓冲区?使用指针算法和
sizeof
运算符?还要注意,您声明
buffer
是一个包含28个字符指针的数组,可能不是您想要的。@JoachimPileborg那么它应该只是“char buffer[28]”要成为28字节的缓冲区?如果
buffer
不是指向大小为1的某个对象的指针,则可以执行
memcpy((char*)buffer+sizeof(header),&DF,sizeof(DF)),或(在gcc中)强制转换为
void*
@abligh:当然可以强制转换,但这种回答会忽略OP的明显错误,即首先使用
char
指针数组。@abligh谢谢!成功了!但我有另一个快速的问题,我被告知用for循环打印,但当我这样做时,我得到了一个相当奇怪的结果:@CakeToppings:你到底是如何打印的?@barakmanos这是一个持续的评论,出于某种原因,它刚刚发送了它。假设报头的值是:CCCCC 7E,假设DF的值是:01020304,缓冲区的值不应该是“CCCCCC 7E01020304”吗?出于某种原因,当我打印它的时候,我得到了:“7efffffccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff。这就是我打印它的方式:对于(inti=0;ibuffer
不是指向大小为1的指针,你可以
memcpy((char*)buffer+sizeof(header),&DF,sizeof(DF)),或(在gcc中)强制转换为
void*
@abligh:当然可以强制转换,但这种回答会忽略OP的明显错误,即首先使用
char
指针数组。@abligh谢谢!成功了!但我有另一个快速的问题,我被告知用for循环打印,但当我这样做时,我得到了一个相当奇怪的结果:@CakeToppings:你到底是如何打印的?@barakmanos这是一个持续的评论,出于某种原因,它刚刚发送了它。假设报头的值是:CCCCC 7E,假设DF的值是:01020304,缓冲区的值不应该是“CCCCCC 7E01020304”吗?出于某种原因,当我打印它的时候,我得到了:“7efffffccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff。这就是我打印它的方式:对于(inti=0;ibuffer.header=header;buffer.DF=DF
您可以为它做简单的赋值:
buffer.header=header;buffer.DF=DF