
上QQ阅读APP看书,第一时间看更新
2.5.8 memcpy()和memmove()
C标准的memcpy()和memmove()函数很容易出错,因为它们不允许调用者指定目标数组的大小。
C11附录K边界检查接口。在C11附录K中定义的memcpy_s()和memmove_s()函数,与相应的安全性较低的memcpy()和memmove()函数类似,但提供了一些额外的保障。为了防止缓冲区溢出,memcpy_s()和memmove_s()函数具有额外的参数来指定目标数组的大小。如果发生运行时约束违反,则目标数组被零填充,以增加问题的能见度。此外,为了减少出现未定义行为情况的数量,如果正在尝试复制重叠的对象,memcpy_s()函数必须报告约束违反。
memcpy_s()和memmove_s()函数如果执行成功则返回0。如果源或目标指针为NULL,或者指定要复制/移动的字符数大于目标缓冲区的最大大小,或者如果要复制/移动的字符数或目标缓冲区的最大大小大于RSIZE_MAX,则返回一个非零值。