2

我有一个奇怪的情况,使用 std::copy 会导致段错误,而使用 memcpy 似乎可以正常工作。

我正在PacketHeaderGoogle 测试函数中创建一个对象。

我已经确认进入对象的数据是有效的,所以我可能很愚蠢并且错过了 std::copy 语法中明显的一些东西。

GCC 版本:4.4.6 20120305 (Red Hat 4.4.6-4) GTest 版本:1.6.0

还与 boost::options 和 libpcap 链接

TEST(SetIP, GoodVals)
{


    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t * handle = pcap_open_offline("./test_files/PCAP_Good.pcap", errbuf);

    pcap_pkthdr * header;
    const unsigned char * pkt_data;

    //Load one packet from the PCAP, doesn't matter what
    pcap_next_ex(handle, &header, &pkt_data);

    PacketHeader p(header);

}


PacketHeader::PacketHeader(const struct pcap_pkthdr * aPacketHeader) : prPacketHeader(NULL)
{
    prPacketHeader = new struct pcap_pkthdr;

    //This doesn't work
    //std::copy(aPacketHeader, aPacketHeader + sizeof(struct pcap_pkthdr), prPacketHeader);

    //This works
    memcpy(prPacketHeader, aPacketHeader, sizeof(struct pcap_pkthdr));

}
4

1 回答 1

10

表达方式

aPacketHeader + sizeof(struct pcap_pkthdr)

不符合您的预期。它实际上添加sizeof(pcap_pkthdr) * sizeof(pcap_pkthdr)到指针基地址。

请记住,aPointer + something与 相同aPointer[something]

要么只添加1

aPacketHeader + 1

或类型转换为char*

reinterpret_cast<char*>(aPacketHeader) + sizeof(struct pcap_pkthdr)

显而易见的解决方案当然应该使用简单的结构到结构复制:

*prPacketHeader = *aPacketHeader;
于 2013-01-30T11:25:04.013 回答