2013-01-21 63 views
0

沒錯,所以我正在使用內存移動數據。我在這裏遇到麻煩。 我能做什麼錯?我已經解決了空終止符,它仍然不會輸出我期望的結果。內存操作 - 我做錯了什麼?

char buff[34] = "I will not do anything like that."; 
char * protocol = "abcdefghi"; 

char data[44]; 

memcpy(data, protocol, 10); 
memcpy(data + 9, buff, 34); 

cout << data << endl; //abcdefghiI will not do anything like that. 
cout << strlen(data) << endl; // 42 

char poin[10]; 
memcpy(poin, data, 10); 

cout << poin << endl; //abcdefghiI╠╠╠╠╠╠╠╠╠╠abcdefghiI will not do anything like that. 

對於最後一個cout我期待只是abcdefghi,但它出來,你看到上面。 任何幫助表示讚賞,謝謝!

+0

我不會推薦在C++中使用strcpy來複制字符串,但是使用memcpy來完成其他級別的C和Classes。我會建議一本好書:http://stackoverflow.com/q/388242/46642 –

+2

順便說一句,答案就像「不,你沒有考慮到空終止符」 –

回答

1

poin不是'\0' - 終止字符串。你跟'I'這裏改寫第一'\0'

memcpy(data + 9, buff, 34); 
0

最後memcpy不包括用於終止空調風格字符串'\0'

使用strcpy或使用C++ - std::string時,您會好得多。

1

因爲poin不是空終止的。 複製開始的10個字節的datapoin,所以現在

poin[0] == 'a' 
poin[1] == 'b' 
poin[2] == 'c' 
poin[3] == 'd' 
poin[4] == 'e' 
poin[5] == 'f' 
poin[6] == 'g' 
poin[7] == 'h' 
poin[8] == 'i' 
poin[9] == 'I' 

然後,std::cout走到陣列外poin的邊界,在這些地址的值確實是未知的。