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

时间:2016-05-13 21:19:23

标签: c++ c

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

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

4 个答案:

答案 0 :(得分:6)

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

在您的情况下,源的大小为13个字节,因此复制不止于此。

答案 1 :(得分:5)

  

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

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

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

答案 2 :(得分:4)

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

strcpy在这个意义上的工作方式不同,因为它会检查'\0'。此外,如果您要将字节从std::string复制到char[],您可能根本不依赖危险的C函数并使用std::copy

答案 3 :(得分:3)

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