【问题标题】:C - append two structs to a single bufferC - 将两个结构附加到单个缓冲区
【发布时间】:2014-09-10 06:43:27
【问题描述】:

我需要使两个结构的内容位于两个结构大小的单个缓冲区内。我需要使用 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 结构在标头完成的地方继续?

【问题讨论】:

  • 使用指针算法和sizeof 运算符?
  • 另请注意,您声明 buffer 是一个包含 28 个字符的 指针 的数组,这可能不是您想要的。
  • @JoachimPileborg 那么它应该只是“char buffer[28]”成为一个 28 字节的缓冲区吗?

标签: c pointers struct buffer memcpy


【解决方案1】:

试试这个:

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

【讨论】:

  • 如果 buffer 不是指向大小为 1 的指针,您可以执行 memcpy((char *)buffer+sizeof(header),&DF,sizeof(DF));,或者(在 gcc 中)强制转换为 void *
  • @abligh:当然你可以强制转换它,但是这种答案会忽略 OP 使用 char 指针数组开头的明显错误。
  • @abligh 谢谢!有效!但是我有另一个快速的问题,有人告诉我用 for 循环打印它,但是当我这样做时,我得到了一个非常奇怪的结果:
  • @CakeToppings:你的打印效果如何?
  • @barakmanos 这是一条继续评论,出于某种原因它刚刚发送了它。假设 header 的值是:CCCCCC7E,假设 DF 的值是:01020304,缓冲区的值不应该是“CCCCCC7E01020304”吗?出于某种原因,当我打印它时,我得到了:“7EFFFFFFCCFFFFFCCFFFFFFCCFFFFFF ...”,然后它就这样持续了几十个字符。这就是我打印它的方式: for (int i = 0; i
【解决方案2】:

避免指针运算的替代答案:

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

您可能希望将__attribute__(packed) 添加到struct 以确保填充不占用空间。

【讨论】:

  • 你可以为此做简单的分配:buffer.header = header; buffer.DF = DF;
【解决方案3】:

只需添加另一个 memcpy

memcpy(buffer + sizeof(header),&DF,sizeof(DF));

还要注意@Joachim Pileborg 提到的问题 因为您可能不需要指针数组。

【讨论】:

    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多