[英]std::copy behavior and pointer arithmetic
我正在写一些东西来序列化数据,因此我需要能够写到特定的内存位置,以便另一个进程能够反序列化结果。
假设我有两个单词要序列化为两个10字节的块,每个块应该看起来像这样。
|---------------------|---------------------|
| 10 | 10 |
|---------------------|---------------------|
| word1 | word2 |
|---------------------|---------------------|
这是我写的一个例子。
#include <algorithm>
#include <string>
#include <iostream>
int main()
{
const char *str1 = "abcd";
const char *str2 = "efgh";
char *buffer = new char[20];
char *cursor = buffer;
cursor = std::copy(str1, str1 + 10, cursor);
cursor = std::copy(str2, str2 + 10, cursor);
std::cout << std::string(buffer, buffer + 8) << std::endl;
}
但是,我们可以看到结果是两个单词彼此相邻。 显然我需要做一些填充,但是为什么会这样呢? 我的猜测是std :: copy会复制“ abcd”,然后继续复制6个以上的字符,即使当时内存中有什么垃圾。
显示的代码中存在多个错误。
cursor = std::copy(str1, str1 + 10, cursor);
cursor = std::copy(str2, str2 + 10, cursor);
str1
和str2
都str1
由4个字符加上尾随的'\\0'
字节组成的字符串文字。 这就是字符串文字。 每个五个字节。 因此,最后,以上代码尝试从五个有效字节中复制前十个字节。 两次。 这是未定义的行为,超过两次。
std::cout << std::string(buffer, buffer + 8) << std::endl;
这将构造一个std::string
,将其初始化为20字节缓冲区的前8个字节; 然后将其内容写入std::cout
。 在这一点上,这已经是未定义的行为。 由此获得的任何输出都是完全没有意义的,并且可以是任何东西。 否则,您的程序甚至可能在此之前崩溃。 这就是“未定义的行为”的意思。
为什么会这样呢?
因为您将迭代器(指针)增加到数组的边界之外,所以程序的行为是不确定的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.