C-将两个结构附加到单个缓冲区
我需要这样做,两个结构的内容将在一个缓冲区内,大小与两个结构相同。我需要使用memcpy来做到这一点 这是我当前的代码: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
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代码>