2013-03-28 43 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