当我使用memcpy_s()
复制数据时,我得到的返回值为404.这是什么意思?我已检查目标缓冲区大小是否大于要复制的字节数。
答案 0 :(得分:4)
memcpy_s()
在C11标准(ISO/IEC 9899:2011)中正式定义,第K.3.7.1.1节,其中只是声明:
如果没有运行时约束违规,则memcpy_s函数返回零。否则,返回非零值。
没有提及memcpy_s()
错误返回的具体值,因此它们是实现定义的。
您没有说明您实际使用的是哪种编译器。
例如,Microsoft的MSVC memcpy_s()
documentation声明memcpy_s()
只能在发生错误时返回EINVAL
或ERANGE
,并且该行为未定义如果源和目的地重叠。
MinGW-w64 exhibits this same behavior
但是,ISO / IEC 9899:2011中的memcpy_s()
定义正式禁止此行为:
不得在重叠的对象之间进行复制。
在某些运行时实现中,可能会返回另一个错误代码:
#define ESOVRLP ( 404 ) /* overlap undefined */
此错误表示源和目标重叠。
由于Microsoft在MSVC(和MinGW)中获取未定义的行为,因此您获得未记录的返回值,因此您可能正在使用一些其他编译器/运行时具有更多符合C11的实现,如果检测到重叠,则返回ESOVRLP
(例如,safeclib does)。