繁体   English   中英

std :: copy行为和指针算法

[英]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);

str1str2str1由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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM