Прервать ловушку: ошибка 6 в Mac OS с использованием strncpy и strcpy

Любые предложения по работе/альтернативе приветствуются. Я пытаюсь перезаписать нули перед возвратом к вызывающей функции. Заявления печати включены.

else if (DB_SPC.option == OSTMP3)
{                                  /* overwrite nulls                  */

  printf("\n value of tmp_buf = %s\n", tmp_buf);

  printf("\n before OSTMP3 Strncpy \n");

  strncpy(tmp_buf+8,tmp_buf+9,6);

  printf("\n after OSTMP3 Strncpy and before strcpy \n");

  strcpy(tmp_buf+14,tmp_buf+16);

  printf("\n after OSTMP3 strcpy \n");

}
value of tmp_buf = 19990101
before OSTMP3 Strncpy 
Abort trap: 6

person Arthur Conroy    schedule 24.01.2021    source источник
comment
Как объявляется tmp_buf?   -  person Johnny Mopp    schedule 24.01.2021
comment
Возможный дубликат stackoverflow.com/q/33276068/1216776   -  person stark    schedule 24.01.2021


Ответы (1)


руководство по strcpy() указывает, что исходный и целевой буферы не должны перекрываться:

Функция strcpy() копирует строку, на которую указывает src, включая завершающий нулевой байт ('\0'), в буфер, на который указывает dest. Строки не могут перекрываться, а целевая строка dest должна быть достаточно большой, чтобы получить копию. Остерегайтесь переполнения буфера! (См. ОШИБКИ.)

person Rachid K.    schedule 24.01.2021
comment
И исправление, вероятно, заключается в использовании memmove(), которое гарантированно работает для перекрывающихся копий. - person Jonathan Leffler; 24.01.2021
comment
memove работал как шарм. спасибо - person Arthur Conroy; 24.01.2021