分段错误(Core dump),不知道为什么

时间:2015-03-20 05:55:39

标签: c++ pointers c++11 char segmentation-fault

我试图编写一个代码,我看到一些分布式应用程序看到它的工作,但我收到一个错误。我试图看到消息的工作

代码是

class Address {
public:
char addr[6];
Address() {}
Address(string address) {
    size_t pos = address.find(":");
    int id = stoi(address.substr(0, pos));
    short port = (short)stoi(address.substr(pos + 1, address.size()-pos-1));
    memcpy(&addr[0], &id, sizeof(int));
    memcpy(&addr[4], &port, sizeof(short));
    }
};



enum MsgTypes{
    JOINREQ,
    JOINREPLY,
    DUMMYLASTMSGTYPE,
    HEARTBEAT
};

/**
 * STRUCT NAME: MessageHdr
 *
 * DESCRIPTION: Header and content of a message
 */
typedef struct MessageHdr {
    enum MsgTypes msgType;
}MessageHdr;

    typedef struct en_msg {
        // Number of bytes after the class
        int size;
        // Source node
        Address from;
        // Destination node
        Address to;
    }en_msg;



void send(Address *myaddr, Address *toaddr, char *data, int size);
    int main()
    {
        MessageHdr *msg;
        size_t msgsize = sizeof(MessageHdr) + sizeof(Address) + sizeof(long) + 1;
        int id=233;
        short  port =22;
        long heartbeat=1;
        string s=to_string(id)+to_string(port);
        string s1=to_string(id+1)+to_string(port+1);
        Address *addr= new Address(s);
        Address *toaddr= new Address(s);
        msg->msgType = JOINREQ;
        memcpy((char *)(msg+1), addr, sizeof(addr));
        memcpy((char *)(msg+1) + 1 + sizeof(addr), (char *)heartbeat, sizeof(long));
        send(addr, toaddr, (char *)msg,  msgsize);
    }

    void send(Address *myaddr, Address *toaddr, char *data, int size) {
        en_msg *em;
        static char temp[2048];

        em = (en_msg *)malloc(sizeof(en_msg) + size);
        em->size = size;

        memcpy(&(em->from), &(myaddr), sizeof(em->from));
        memcpy(&(em->to), &(toaddr), sizeof(em->from));
        memcpy(em + 1, data, size);
        cout<<em;
    }

错误只是这一行:

  

分段错误(核心转储)

1 个答案:

答案 0 :(得分:0)

1)正如退休忍者在评论中所说,main的第一行必须像

   MessageHdr *msg = new MessageHdr();

因为msg->msgType = JOINREQ;会导致未分配的msg错误。

2)由于像

这样的表达式,第一个修复无效
 (char *)(msg+1)

此处msg MessageHdr *类型char *在地址算术中用作 (char *)(msg+1) + 1 。我的意思是通过样式表达来计算地址是危险的

msg

虽然MessageHdr*属于(msg+1)类型,但MessageHdr - 表示转换为下一个结构+1以及转换为char*后的MessageHdr }意味着转移到一个字节。我个人无法理解逻辑,而enum结构只有一个Address字段,并且如此奇怪的地址操作,你试图适应long int类(或memcpy值的实例使用{{1}}到该结构。

<强>结论:

在操作中编写注释和使用清晰逻辑需要非常重要的程序重新设计。