好的我把整个结构放在这里,它的一个名为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]
,可以改变这些数据,并从标题内的长度字段收集信息。我必须构建一个数据包,并且必须放入该数据。请看一下。
答案 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
};