调用计数大于为 src 分配的内存的 memcpy 是否安全


std::string str = "hello world!";
char dest[16];
memcpy(dest, str.c_str(), 16);

str.c_str(( 将返回一个以 null 结尾的字符数组。但是,如果我调用计数大于 13 的 memcpy,会发生什么?dest 会是一个以 null 结尾的字符数组吗?有什么需要我谨慎的吗?

您的代码具有未定义的行为。使用 memcpy 时,需要确保复制的字节数不大于 min(size_of_recepientsize_of_source (。

在您的情况下,源的大小为 13 个字节,因此复制超过这个数字是不行的。

dest 会是一个以 null 结尾的字符数组吗?我有什么事吗 需要谨慎吗?

不幸的是,dest的第一部分将是一个以 null 结尾的字符数组,因为str.c_str()返回一个以 null 结尾的字符数组......但是dest的其余部分肯定会包含一些额外的垃圾。

正在访问您不知道的额外内存...您的代码可以重新格式化您的 PC ...它被称为未定义的行为,

如果你给它一个计数,那就是将复制多少个连续字节。这意味着,如果传入的计数大于实际源数据,则会从字符串之后读取所有这些字节。如果此内存不属于要使用的程序,则可能会由于分段错误而导致崩溃。

从这个意义上说,strcpy的工作方式不同,因为它检查'' 。另外,如果你想将字节从std::string复制到char[],你可以简单地不依赖危险的C函数并使用std::copy

这不安全。你应该使用 strncpy ,这是为此而制作的。 "hello world!" std::string结束后的内容未定义。它可能是堆中未定义的部分,在这种情况下,您将复制可能称为垃圾的内容,或者它可能冒险进入未分配的内存页面,在这种情况下,您将获得段错误并且您的程序死亡。(除非它有一些聪明的魔法来处理段错误,从你的问题来看,它可能没有。

最新更新