2

std::copy を使用するとセグ フォールトが発生し、memcpy を使用すると正しく動作しているように見えるという奇妙な状況があります。

PacketHeaderGoogle Test 関数内にオブジェクトを作成しています。

オブジェクトに入るデータが有効であることを確認したので、おそらく愚かで、 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 に答える