填充结构中的数组字段

时间:2012-02-04 09:52:29

标签: c arrays struct

好的我把整个结构放在这里,它的一个名为openflow的协议的规范是在一些工业交换机中实现的,所以结构就像:

struct ofp_packet_in {
    struct ofp_header header;
    uint32_t buffer_id;     /* ID assigned by datapath. */
    uint16_t total_len;     /* Full length of frame. */
    uint16_t in_port;       /* Port on which frame was received. */
    uint8_t reason;         /* Reason packet is being sent (one of OFPR_*) */
    uint8_t pad;
    uint8_t data[0];        /* Ethernet frame, halfway through 32-bit word,
                               so the IP header is 32-bit aligned.  The
                               amount of data is inferred from the length
                               field in the header.  Because of padding,
                               offsetof(struct ofp_packet_in, data) ==
                               sizeof(struct ofp_packet_in) - 2. */
};
OFP_ASSERT(sizeof(struct ofp_packet_in) == 20);

现在我必须填写最后一个字段中的一些数据 - uint8_t data[0],可以改变这些数据,并从标题内的长度字段收集信息。我必须构建一个数据包,并且必须放入该数据。请看一下。

3 个答案:

答案 0 :(得分:1)

您需要使用动态分配并复制内容。

类似的东西:

#include <stdlib.h>
#include <string.h>

void foo(void) {
  struct some_struct *container = malloc(sizeof(struct some_struct) + 100);
  if (!container) {
    // handle out-of-memory situation
  }
  memcpy(container->data, some_data, 100);
}

答案 1 :(得分:0)

你不能这样做。它不适合!结构中的数组长度为0个字符,您尝试将100个字符数组填充到其中。

如果由于某种原因,您确定结构后面的内存可用,例如你只需按照这样做:

some_struct *foo = (some_struct*)malloc(sizeof(some_struct) + 100);

然后你可以这样做:

memcpy(foo->data, some_data, 100);

这是可怕的,可能仍然是未定义的行为,但我已经看到需要这个的API(Windows?)。

答案 2 :(得分:0)

你做不到。

您将 some_struct.data 的大小定义为 0 ,这意味着它无法保留任何项目。
如果你想要的只是复制最大值。 100个项目,然后您可以静态定义大小:

struct some_struct { 
char data[100];  // some_struct.data has room for up to 100 characters 
};