【问题标题】:What memcpy_s return error 404 mean [closed]memcpy_s返回错误404是什么意思[关闭]
【发布时间】:2016-10-28 18:06:23
【问题描述】:

当我使用memcpy_s()复制数据时,我得到一个返回值404。这是什么意思?我检查了目标缓冲区大小是否大于要复制的字节数。

【问题讨论】:

  • 请发布显示问题的Minimal, Complete, and Verifiable example,以及您从哪里获得“返回值”。
  • 错误 404?每个人都知道这意味着'没有这样的文件或目录':-)
  • 并且:404 通常是HTTP Error,与 C/C++ 无关。
  • man page for memcpy_s 声明它可能会在发生错误时返回EINVALERANGE。两者都没有值404
  • @WeatherVane:是的,但还有另一个错误代码 - ESOVRLP

标签: c


【解决方案1】:

memcpy_s() 在 C11 标准 (ISO/IEC 9899:2011) 的 K.3.7.1.1 部分中正式定义,其中简单说明:

如果没有违反运行时约束,memcpy_s 函数将返回零。否则,返回一个非零值。

没有提及memcpy_s() 在错误时返回的具体值,因此它们是实现定义的。

你没有说你实际使用的是哪个编译器。

例如,Microsoft 针对 MSVC 的 memcpy_s() documentation 声明 memcpy_s() 只能在发生错误时返回 EINVALERANGE,并且如果源和目标重叠,则该行为未定义。

MinGW-w64 exhibits this same behavior.

但是,ISO/IEC 9899:2011 中的 memcpy_s() 定义正式禁止这种行为:

不能在重叠的对象之间进行复制。

在某些运行时实现中,可能会返回另一个错误代码:

#define ESOVRLP         ( 404 )       /* overlap undefined           */

此错误表示源和目标重叠。

由于您在 MSVC(和 MinGW)中为 undefined 的行为获得了 Microsoft undocumented 的返回值,因此有理由认为您可能正在使用如果检测到重叠(例如,safeclib does),则具有更符合 C11 的实现的其他一些编译器/运行时返回 ESOVRLP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 2015-06-21
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2010-12-29
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多