记忆操纵 - 我做错了什么?

时间:2013-01-21 12:06:52

标签: c++ arrays memory character memcpy

是的,所以我正在玩内存移动数据。我在这里遇到麻烦。 我能做错什么?我已经考虑了空终止符,它仍然没有输出我期望的结果。

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,但是如上所述它出来了。 任何帮助表示赞赏,谢谢!

3 个答案:

答案 0 :(得分:1)

poin不是以'\0'结尾的字符串。你在这里用'\0'覆盖了第一个'I'

memcpy(data + 9, buff, 34);

答案 1 :(得分:1)

因为poin不是以空值终止的。 您将data的前10个字节复制到poin,现在

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的边界,这些地址中的值确实未知。

答案 2 :(得分:0)

最后一个memcpy不包含用于终止C样式字符串的'\0'

使用strcpy或使用C ++ - std::string会更好。