2013-07-05 33 views
1

我有十六進制值0x48656c6c6f其中每個字節表示字符串"Hello"中每個字符的ASCII值。我也有一個char數組,我想要插入這些值。爲什麼memcpy從int到char不起作用?

當我有一個較小的十六進制值(例如,0x48656c6c,它代表"Hell")時,打印出char數組給出了正確的輸出。但下面的代碼打印"olle"(在小端)但不是"olleH"。爲什麼是這樣?

#include <iostream>       
#include <cstring>        

int main() 
{ 
    char x[6] = {0}; 
    int y = 0x48656c6c6f; 

    std::memcpy(x, &y, sizeof y); 

    for (char c : x) 
     std::cout << c; 
} 

Demo is here.

+1

是int 32位還是64? – user1810087

+0

@itwasntpete 32 –

+1

編譯器有警告。使用它們。 –

回答

5

可能int在您的機器上是32位,這意味着常量的高位字節被削減;所以,你的int y = 0x48656c6c6f;實際上是int y = 0x656c6c6f;(順便說一下,我認爲它被視爲有符號整數溢出,因此未定義的行爲;要在這裏定義的行爲,你應該使用unsigned int)。

因此,在一個little endian機器上,y的內存中表示形式爲6f 6c 6c 65,它被複制到x,導致您看到的「olle」。

要「解決」問題,您應該使用更大的整數,根據您的平臺,它可能是long longint64_t或類似的東西。在這種情況下,請務必使x足夠大(char x[sizeof(y)+1]={0})以避免緩衝區溢出或更改memcpy以僅複製適合於x的字節。

此外,在執行這些技巧時總是使用unsigned整數 - 避免UB並在溢出時獲得可預測的行爲。

5

大概int是你的平臺上四個字節。

ideone確實顯示一個警告,如果還有一個錯誤: http://ideone.com/TSmDk5

prog.cpp:在函數 '詮釋主()': prog.cpp:7:13:警告:溢出在隱不斷變換[-Woverflow] prog.cpp:12:5:錯誤: '錯誤' 在此範圍

1
int y = 0x48656c6c6f; 

int未聲明不guaranteeed來存放它,可能是因爲你的機器是32位的。使用long long代替

0

這是因爲在您的平臺上int只有4個字節,並且當您提供大於該值的文字時,H將被刪除。

相關問題