首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对结构数据的“大小”和编译错误的无效应用

对结构数据的“大小”和编译错误的无效应用
EN

Stack Overflow用户
提问于 2016-02-01 10:07:10
回答 2查看 807关注 0票数 1

我创建了想要通过套接字发送的数据类型。我得到了一个编译错误和一个分段错误。我得到的编译错误是error: invalid application of ‘sizeof’ to incomplete type ‘struct udp_msg_t’,而分段错误发生在执行memcpy时。我做错了什么?

以下是我的一些代码:

这是我所关注的结构,我定义了:

代码语言:javascript
复制
typedef struct udp_msg {
    unsigned int udp_eid;
    u_char   udp_prefix;
    unsigned int udp_loc;
} udp_msg_t;

在一种方法中,我分配内存和值:

代码语言:javascript
复制
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);
}

该方法实际上通过套接字发送数据:

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-01 13:34:53

我没有正确地获得struct字段的指针值。正确的做法是执行memcpy:

代码语言:javascript
复制
memcpy(buffer, (char *) &message.udp_eid, sizeof(unsigned int));
票数 1
EN

Stack Overflow用户

发布于 2016-02-01 10:11:34

代码语言:javascript
复制
sizeof(struct udp_msg_t)

是不正确的-它应该是

代码语言:javascript
复制
sizeof(udp_msg_t)

代码语言:javascript
复制
sizeof(struct udp_msg)

演员也是:

代码语言:javascript
复制
(struct udp_msg_t * )

在调用calloc之前,尽管应该删除它,因为它是redundant and potentially dangerous

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35127743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档