2016-10-28 2 views
-7

Когда я использую memcpy_s() для копирования данных, я получаю возвращаемое значение 404. Что это значит? Я проверил, что размер буфера назначения больше, чем количество копируемых байтов.Что memcpy_s возвращает ошибку 404 означает

+2

Просьба указать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), который показывает проблему, и откуда вы получаете свое «возвращаемое значение». –

+0

Ошибка 404? Всем известно, что это означает «нет такого файла или каталога» ':-)' –

+0

И: 404 обычно является [HTTP Error] (https://en.wikipedia.org/wiki/HTTP_404) и не имеет ничего общего с C/C++. –

ответ

4

memcpy_s() формально определяется в стандарте C11 (ISO/IEC 9899:2011), раздел K.3.7.1.1, который просто заявляет:

Функция memcpy_s возвращает ноль, если не было никаких нарушений во время выполнения-ограничение. В противном случае возвращается ненулевое значение.

Не упоминается о конкретных значениях, которые memcpy_s() возвращаются к ошибке, поэтому они определены реализацией.

Вы не сказали, какой компилятор вы используете.

Например, Microsoft, memcpy_s() documentation для MSVC утверждает, что memcpy_s() может только возвращать либо EINVAL или ERANGE при возникновении ошибки, и что поведение не определено, если источник и место назначения перекрытия.

MinGW-w64 exhibits this same behavior.

Однако такое поведение формально запрещено memcpy_s() определением, содержащимся в ISO/IEC 9899: 2011:

Копирование не должно иметь место между объектами, которые перекрывают друг друга.

В некоторых реализациях среды исполнения, есть другой код ошибки, который может быть возвращен:

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

Эта ошибка означает, что источник и место назначения накладываются друг на друга.

Поскольку вы получаете возвращаемое значение, которое нелегальную по Microsoft за поведение, которое в MSVC (и MinGW) неопределенной, само собой разумеется, что вы, вероятно, с помощью какого-либо другого компилятора/выполнения, который имеет более C11-совместимая реализация, которая возвращает ESOVRLP, если обнаружено перекрытие (например, safeclib does).

Смежные вопросы