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

DXM*_*DXM -1 c c++

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

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

Ser*_*eyA 6

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

在您的情况下,源的大小是13个字节,因此复制更多不是好的.


Whi*_*TiM 5

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

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

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

  • 是否有额外的垃圾并不重要.重要的是你正在访问超出对象末尾的内存.如果你从一个足够大的对象复制,后面包含一个以null结尾的字符数组,然后是垃圾,那就没问题了; `memcpy`只会无害地复制垃圾. (3认同)