Принимая во внимание, что сообщение массива также изменяется, как вы написали в своем вопросе, тогда становится очевидным, что вы используете функцию неправильно, и в результате вы получаете неопределенное поведение.
Например, третий параметр, который вы назвали как message_offset_2
, указывает количество символов, которые должны быть скопированы из строки в целевой массив символов. Поэтому его не следует называть message_offset_2
.
Другой причиной неопределенного поведения может быть использование перекрывающихся массивов.
Таким образом, либо третий аргумент указан неверно, либо имеет место перекрытие массивов символов.
Но в любом если функция объявлена и определена неверно.
Если это обертка вокруг стандартной C функции strncpy
, то она должна быть объявлена как минимум как
char * strncpySafe( char * restrict s1, const char * restrict s2, size_t n );
Или, если она объявляется как функция C ++, тогда
char * strncpySafe( char * s1, const char * s2, size_t n );
Если функция предназначена для копирования n
символов, тогда тело функции должно выглядеть как
if ( n )
{
strncpy( s1, s2, n );
s1[n] = '\0';
}
return s1;
Таким образом, целевой массив должен иметь как минимум n + 1
элементов.
And (C Standard, 7.23.2.4 функция strncpy)
Если копирование происходит между объектами, которые перекрываются, поведение undefined.