“sizeof”的无效应用和结构数据的编译错误
invalid application of ‘sizeof’ and compilation error with struct data
我创建了一个要通过套接字发送的数据类型。
我收到编译错误和分段错误。
我得到的编译错误是 error: invalid application of ‘sizeof’ to incomplete type ‘struct udp_msg_t’
,而当我执行 memcpy
时发生分段错误。我做错了什么?
这是我的一些代码:
这是我所关注的我定义的结构:
typedef struct udp_msg {
unsigned int udp_eid;
u_char udp_prefix;
unsigned int udp_loc;
} udp_msg_t;
在我分配内存和值的方法中:
void method(){
udp_msg_t * udp_msg;
udp_msg = (struct udp_msg_t * )calloc(1, sizeof(struct udp_msg_t));
udp_msg->udp_eid = eid.u.prefix4.s_addr;
udp_msg->udp_prefix = eid.prefixlen;
udp_msg->udp_loc = loc->rloc.rloc.s_addr;
send_rloc_udp_to_floodlight(udp_msg);
}
并且此方法实际上通过套接字发送数据:
int send_rloc_udp_to_floodlight(udp_msg_t message) {
struct sockaddr_in si_other;
int s, i, slen = sizeof(si_other);
char buffer[9];
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
printf("socket");
}
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(8888);
if (inet_aton("127.0.0.1", &si_other.sin_addr) == 0) {
fprintf(stderr, "inet_aton() failed\n");
exit(1);
}
memcpy(buffer, (char *) message.udp_eid, sizeof(unsigned int));
memcpy(&buffer[4], (char *) message.udp_prefix, sizeof(char));
memcpy(&buffer[5], (char *) message.udp_loc, sizeof(unsigned int));
//send the message
if (sendto(s, buffer, strlen(buffer), 0, (struct sockaddr *) &si_other,
slen) == -1) {
printf("sendto()");
}
close(s);
return 0;
}
sizeof(struct udp_msg_t)
不正确 - 应该是
sizeof(udp_msg_t)
或
sizeof(struct udp_msg)
演员同上:
(struct udp_msg_t * )
在对 calloc
的调用之前,虽然这应该被删除,因为它是 redundant and potentially dangerous.
我没有正确获取结构字段的指针值。正确的 memcpy 是:
memcpy(buffer, (char *) &message.udp_eid, sizeof(unsigned int));
我创建了一个要通过套接字发送的数据类型。
我收到编译错误和分段错误。
我得到的编译错误是 error: invalid application of ‘sizeof’ to incomplete type ‘struct udp_msg_t’
,而当我执行 memcpy
时发生分段错误。我做错了什么?
这是我的一些代码:
这是我所关注的我定义的结构:
typedef struct udp_msg {
unsigned int udp_eid;
u_char udp_prefix;
unsigned int udp_loc;
} udp_msg_t;
在我分配内存和值的方法中:
void method(){
udp_msg_t * udp_msg;
udp_msg = (struct udp_msg_t * )calloc(1, sizeof(struct udp_msg_t));
udp_msg->udp_eid = eid.u.prefix4.s_addr;
udp_msg->udp_prefix = eid.prefixlen;
udp_msg->udp_loc = loc->rloc.rloc.s_addr;
send_rloc_udp_to_floodlight(udp_msg);
}
并且此方法实际上通过套接字发送数据:
int send_rloc_udp_to_floodlight(udp_msg_t message) {
struct sockaddr_in si_other;
int s, i, slen = sizeof(si_other);
char buffer[9];
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
printf("socket");
}
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(8888);
if (inet_aton("127.0.0.1", &si_other.sin_addr) == 0) {
fprintf(stderr, "inet_aton() failed\n");
exit(1);
}
memcpy(buffer, (char *) message.udp_eid, sizeof(unsigned int));
memcpy(&buffer[4], (char *) message.udp_prefix, sizeof(char));
memcpy(&buffer[5], (char *) message.udp_loc, sizeof(unsigned int));
//send the message
if (sendto(s, buffer, strlen(buffer), 0, (struct sockaddr *) &si_other,
slen) == -1) {
printf("sendto()");
}
close(s);
return 0;
}
sizeof(struct udp_msg_t)
不正确 - 应该是
sizeof(udp_msg_t)
或
sizeof(struct udp_msg)
演员同上:
(struct udp_msg_t * )
在对 calloc
的调用之前,虽然这应该被删除,因为它是 redundant and potentially dangerous.
我没有正确获取结构字段的指针值。正确的 memcpy 是:
memcpy(buffer, (char *) &message.udp_eid, sizeof(unsigned int));