调用计数大于为 src 分配的内存的 memcpy 是否安全
Is it safe to call memcpy with count greater than memory allocated for src?
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_recepient
, size_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
结束后的内容未定义。它可能是堆中未定义的部分,在这种情况下,您将复制可能称为垃圾的内容,或者它可能冒险进入未分配的内存页面,在这种情况下,您将获得段错误并且您的程序死亡。(除非它有一些聪明的魔法来处理段错误,从你的问题来看,它可能没有。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 内存移动的性能与memcpy相比是两倍?
- 最终的ARM Linux内存碎片与NEON Copy,但不是memcpy
- 如何知道memcpy()函数在完成餐具期间已成功复制了内存
- 调用计数大于为 src 分配的内存的 memcpy 是否安全
- 为什么堆栈内存的 memcpy 比堆内存快得多
- 使用memcpy将整个内存区域克隆到我自己的内存中
- 使用memcpy时出现内存错误
- 在std::swap和memcpy之后释放内存
- 如果使用memcpy,释放内存时出错
- 无法使用memcpy写入内存,但可以使用WriteProcessMemory
- 我真的需要扫描内存两次来执行memcmp + memcpy吗?
- 使用memcpy复制数组的一部分,以及其他内存操作工具
- 如何正确地从内存中读取数据(memcpy)