c++ - 使用 memcpy 复制 n 个字符

标签 c++ c++11 memcpy

我正在尝试使用 memcpy 复制 32 个字符的确切数量,但是我在正确使用它时遇到了问题,因为多个在线 g++ 编译器以及我机器上的编译器使用相同的源代码给出的结果略有不同代码。

代码:

#include <iostream>
#include <cstring>

int main()
{
    const char* source = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu ipsum nec elit mattis consequat. Curabitur sollicitudin ligula et quam bibendum euismod.";
    char dest[32];

    std::memcpy(&dest, source, sizeof(dest));
    std::cout << dest << "(" << strlen(dest) << ")";
}

代码编译于here (G++4.9.2).

输出不包含 32 个字符(正在添加垃圾值):

Lorem ipsum dolor sit amet, cons †¿(36)

代码编译于here (G++4.9).

输出包含必需的结果:

Lorem ipsum dolor sit amet, cons(32)

我机器上的输出类似于第一个输出(36 个字符)。

为什么每个结果都不一样?

复制 n 个字符的 memcpy 的有效用法应该是什么?

最佳答案

strlen函数和 operator<< (const char *)函数只适用于 C 风格的字符串。它们不能用于输出或测量任意数据 block 的长度。

想一想——他们怎么可能确定长度?他们可能使用什么方法?

Why is each result different?

因为您使用的函数只能用于非 C 风格字符串的 C 风格字符串。这是一个根据平台内存布局的具体情况而表现不同的错误。

What should be the valid usage of memcpy to copy n numbers of characters?

就是这样。你复制了字符。但是现在你只有一堆字符,而不是字符串。如果您使用打印字符束的函数,它们会正常工作。

试试这个:

#include <iostream>
#include <cstring>

int main()
{
    const char* source = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu ipsum nec elit mat
    char dest[32];

    std::memcpy(&dest, source, sizeof(dest));

    for (int i = 0; i < sizeof(dest); ++i)
        std::cout << dest[i];
}

关于c++ - 使用 memcpy 复制 n 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36644523/

相关文章:

c - 用零填充 C-Array,然后将数据复制到其中

c - 提高通用交换的性能

c - 如何在C中将数组拆分为两个数组

c++ - (bool) cast 的默认行为

c++ - CMarkup XML 处理

c++ - 检查 C++/C++11 中的输入缓冲区对齐 : what is the best way?

c++ - 为什么 std::bind 在这个例子(成员函数)中没有占位符就不能工作?

c++ - 错误的 std::vector 构造函数

c++ - 在 C++ 中缩放 double 时的精度差异

c++ - 使用带有 QObject 的类的编译器错误 "collect2: Id returned 1 exit status"(带有 Qt Creator 的 QT 4.7)