2013-03-28 118 views
0

我正在研究一些代碼,並且我有一點要抓取一些二進制數據,然後想從中提取一些字節。所以,我有以下幾點:std ::複製設置指針爲空

unsigned char * payload; 
int payload_size; 
uint32_t major = 0, minor = 0; 
payload = out_resp.get_payload(&payload_size); // Retrieve the data, return a pointer 
if(payload_size >= 8) { // Need at least 8 bytes in the payload 
    std::copy(payload, payload + 4, &major); 
    std::copy(payload + 4, payload + 8, &minor); 
} 

正如你可以看到,從有效載荷的前四個字節應該放在major,並在minor未來四年。但是,在進行調試時,我注意到在第一個std::copy之後,我的變量​​設置爲NULL

std::copy這是預期的行爲,還是出了問題?我應該通過簡單地創建另一個指針來避免這種情況,並將其傳遞給std::copy

+0

我正在運行GDB。當GDB到達第二個拷貝行時,我打印payload,並接收:(gdb)print payload; '$ 4 =(unsigned char *)0x0' – TrueJournals 2013-03-28 01:50:31

回答

4

std::copy不能像memcpy那樣工作。您的std::copy(payload, payload + 4, &major);將複製:

(&major)[0] = payload[0]; 
(&major)[1] = payload[1]; 
(&major)[2] = payload[2]; 
(&major)[3] = payload[3]; 

而這不是你所需要的。 (&major)[1]超出界限,因此分配給它會導致未定義的行爲。

+0

嗯......這很有道理,而改用memcpy確實可行。謝謝! – TrueJournals 2013-03-28 01:56:27