std::string str = "hello world!";
char dest[16];
memcpy(dest, str.c_str(), 16);
str.c_str()将返回以null结尾的char数组。但是,如果我调用大于13的memcpy,会发生什么? dest将是一个以null结尾的char数组吗?有什么我需要谨慎的吗?
答案 0 :(得分:6)
您的代码有未定义的行为。使用memcpy
时,您需要确保要复制的字节数不大于最小值(size_of_recepient
,size_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
结束后的内容未定义。它可能是堆中未定义的部分,在这种情况下,您将复制可能被称为垃圾的内容,或者它可能冒险进入未分配的内存页面,在这种情况下,您将获得段错误并且程序将死亡。 (除非它有一些聪明的魔法来处理段错误,从您的问题判断,它可能没有。)