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,但正如你在上面看到的那样。任何帮助表示赞赏,谢谢!

4

3 回答 3

1

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

memcpy(data + 9, buff, 34);
于 2013-01-21T12:10:49.067 回答
1

因为poin不是空终止的。你复制了datainto的前 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超出了 arraypoin的边界,这些地址中的值确实是未知的。

于 2013-01-21T12:12:50.763 回答
0

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

strcpy使用,或者使用 C++ - 时,你会好得多std::string

于 2013-01-21T12:11:12.617 回答