Так ли безопасна strncpy?
Многие считают strncpy безопасной заменой strcpy, но есть подвох, который может привести к ошибкам или утечкам памяти. Рассмотрим классический кейс, где strncpy ведет себя неочевидно. Классическая ошибка с strncpy: char *a = "dsdsd"; // Длина 5 символов + '\0' char *b = malloc(4); // Выделяем 4 байта strncpy(b, a, 4); printf("%s", b); // Выход за границы буфера! free(b); strncpy заполняет буфер ровно заданным количеством байт (в нашем случае 4). Если исходная строка короче, она дополняется нулями. Но если строка длиннее или равна лимиту, завершающий нуль ('\0') не добавляется. В результате printf читает память до первого встречного нуля, вылезая за пределы выделенного буфера (b). Чтобы избежать проблем, используйте комбинацию strnlen, динамического выделения памяти и явного завершения строки: char *a = "dsdsd"; size_t len = strnlen(a, 4) + 1; char *b = malloc(len); memcpy(b, a, len - 1); b[len - 1] = '\0'; printf("%s", b); // OK free(b);
memcpy работает быстрее strncpy, потому что это чистое копирование памяти. Он просто копирует N байт, не проверяя границы и не ища конец строки. strncpy же должен постоянно сверяться с длиной, а если строка короче заданного лимита - заполнять остаток буфера нулями. Эта лишняя логика и дописывание нулей съедают время, тогда как memcpy делает всё максимально просто и быстро.